add test to show suboptimal load merging behavior
[oota-llvm.git] / test / CodeGen / X86 / implicit-null-check.ll
1 ; RUN: llc -O3 -mtriple=x86_64-apple-macosx -enable-implicit-null-checks < %s | FileCheck %s
2
3 define i32 @imp_null_check_load(i32* %x) {
4 ; CHECK-LABEL: _imp_null_check_load:
5 ; CHECK: Ltmp1:
6 ; CHECK: movl (%rdi), %eax
7 ; CHECK: retq
8 ; CHECK: Ltmp0:
9 ; CHECK: movl $42, %eax
10 ; CHECK: retq
11
12  entry:
13   %c = icmp eq i32* %x, null
14   br i1 %c, label %is_null, label %not_null
15
16  is_null:
17   ret i32 42
18
19  not_null:
20   %t = load i32, i32* %x
21   ret i32 %t
22 }
23
24 define i32 @imp_null_check_gep_load(i32* %x) {
25 ; CHECK-LABEL: _imp_null_check_gep_load:
26 ; CHECK: Ltmp3:
27 ; CHECK: movl 128(%rdi), %eax
28 ; CHECK: retq
29 ; CHECK: Ltmp2:
30 ; CHECK: movl $42, %eax
31 ; CHECK: retq
32
33  entry:
34   %c = icmp eq i32* %x, null
35   br i1 %c, label %is_null, label %not_null
36
37  is_null:
38   ret i32 42
39
40  not_null:
41   %x.gep = getelementptr i32, i32* %x, i32 32
42   %t = load i32, i32* %x.gep
43   ret i32 %t
44 }
45
46 define i32 @imp_null_check_add_result(i32* %x, i32 %p) {
47 ; CHECK-LABEL: _imp_null_check_add_result:
48 ; CHECK: Ltmp5:
49 ; CHECK: addl (%rdi), %esi
50 ; CHECK: movl %esi, %eax
51 ; CHECK: retq
52 ; CHECK: Ltmp4:
53 ; CHECK: movl $42, %eax
54 ; CHECK: retq
55
56  entry:
57   %c = icmp eq i32* %x, null
58   br i1 %c, label %is_null, label %not_null
59
60  is_null:
61   ret i32 42
62
63  not_null:
64   %t = load i32, i32* %x
65   %p1 = add i32 %t, %p
66   ret i32 %p1
67 }
68
69 ; CHECK-LABEL: __LLVM_FaultMaps:
70
71 ; Version:
72 ; CHECK-NEXT: .byte 1
73
74 ; Reserved x2
75 ; CHECK-NEXT: .byte 0
76 ; CHECK-NEXT: .short 0
77
78 ; # functions:
79 ; CHECK-NEXT: .long 3
80
81 ; FunctionAddr:
82 ; CHECK-NEXT: .quad _imp_null_check_add_result
83 ; NumFaultingPCs
84 ; CHECK-NEXT: .long 1
85 ; Reserved:
86 ; CHECK-NEXT: .long 0
87 ; Fault[0].Type:
88 ; CHECK-NEXT: .long 1
89 ; Fault[0].FaultOffset:
90 ; CHECK-NEXT: .long Ltmp5-_imp_null_check_add_result
91 ; Fault[0].HandlerOffset:
92 ; CHECK-NEXT: .long Ltmp4-_imp_null_check_add_result
93
94 ; FunctionAddr:
95 ; CHECK-NEXT: .quad _imp_null_check_gep_load
96 ; NumFaultingPCs
97 ; CHECK-NEXT: .long 1
98 ; Reserved:
99 ; CHECK-NEXT: .long 0
100 ; Fault[0].Type:
101 ; CHECK-NEXT: .long 1
102 ; Fault[0].FaultOffset:
103 ; CHECK-NEXT: .long Ltmp3-_imp_null_check_gep_load
104 ; Fault[0].HandlerOffset:
105 ; CHECK-NEXT: .long Ltmp2-_imp_null_check_gep_load
106
107 ; FunctionAddr:
108 ; CHECK-NEXT: .quad _imp_null_check_load
109 ; NumFaultingPCs
110 ; CHECK-NEXT: .long 1
111 ; Reserved:
112 ; CHECK-NEXT: .long 0
113 ; Fault[0].Type:
114 ; CHECK-NEXT: .long 1
115 ; Fault[0].FaultOffset:
116 ; CHECK-NEXT: .long Ltmp1-_imp_null_check_load
117 ; Fault[0].HandlerOffset:
118 ; CHECK-NEXT: .long Ltmp0-_imp_null_check_load