xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/implicit-null-check.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -O3 -mtriple=x86_64-apple-macosx -enable-implicit-null-checks < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-macosx -enable-implicit-null-checks \
4*9880d681SAndroid Build Coastguard Worker; RUN:    | llvm-mc -triple x86_64-apple-macosx -filetype=obj -o - \
5*9880d681SAndroid Build Coastguard Worker; RUN:    | llvm-objdump -triple x86_64-apple-macosx -fault-map-section - \
6*9880d681SAndroid Build Coastguard Worker; RUN:    | FileCheck %s -check-prefix OBJDUMP
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -enable-implicit-null-checks \
9*9880d681SAndroid Build Coastguard Worker; RUN:    | llvm-mc -triple x86_64-unknown-linux-gnu -filetype=obj -o - \
10*9880d681SAndroid Build Coastguard Worker; RUN:    | llvm-objdump -triple x86_64-unknown-linux-gnu -fault-map-section - \
11*9880d681SAndroid Build Coastguard Worker; RUN:    | FileCheck %s -check-prefix OBJDUMP
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Workerdefine i32 @imp_null_check_load(i32* %x) {
14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _imp_null_check_load:
15*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB0_imp_null_check_load:L[^:]+]]:
16*9880d681SAndroid Build Coastguard Worker; CHECK: movl (%rdi), %eax
17*9880d681SAndroid Build Coastguard Worker; CHECK: retq
18*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB1_imp_null_check_load:LBB0_[0-9]+]]:
19*9880d681SAndroid Build Coastguard Worker; CHECK: movl $42, %eax
20*9880d681SAndroid Build Coastguard Worker; CHECK: retq
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker entry:
23*9880d681SAndroid Build Coastguard Worker  %c = icmp eq i32* %x, null
24*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %is_null, label %not_null, !make.implicit !0
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker is_null:
27*9880d681SAndroid Build Coastguard Worker  ret i32 42
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker not_null:
30*9880d681SAndroid Build Coastguard Worker  %t = load i32, i32* %x
31*9880d681SAndroid Build Coastguard Worker  ret i32 %t
32*9880d681SAndroid Build Coastguard Worker}
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workerdefine i32 @imp_null_check_gep_load(i32* %x) {
35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _imp_null_check_gep_load:
36*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB0_imp_null_check_gep_load:L[^:]+]]:
37*9880d681SAndroid Build Coastguard Worker; CHECK: movl 128(%rdi), %eax
38*9880d681SAndroid Build Coastguard Worker; CHECK: retq
39*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB1_imp_null_check_gep_load:LBB1_[0-9]+]]:
40*9880d681SAndroid Build Coastguard Worker; CHECK: movl $42, %eax
41*9880d681SAndroid Build Coastguard Worker; CHECK: retq
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker entry:
44*9880d681SAndroid Build Coastguard Worker  %c = icmp eq i32* %x, null
45*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %is_null, label %not_null, !make.implicit !0
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker is_null:
48*9880d681SAndroid Build Coastguard Worker  ret i32 42
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker not_null:
51*9880d681SAndroid Build Coastguard Worker  %x.gep = getelementptr i32, i32* %x, i32 32
52*9880d681SAndroid Build Coastguard Worker  %t = load i32, i32* %x.gep
53*9880d681SAndroid Build Coastguard Worker  ret i32 %t
54*9880d681SAndroid Build Coastguard Worker}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerdefine i32 @imp_null_check_add_result(i32* %x, i32 %p) {
57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _imp_null_check_add_result:
58*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB0_imp_null_check_add_result:L[^:]+]]:
59*9880d681SAndroid Build Coastguard Worker; CHECK: addl (%rdi), %esi
60*9880d681SAndroid Build Coastguard Worker; CHECK: movl %esi, %eax
61*9880d681SAndroid Build Coastguard Worker; CHECK: retq
62*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB1_imp_null_check_add_result:LBB2_[0-9]+]]:
63*9880d681SAndroid Build Coastguard Worker; CHECK: movl $42, %eax
64*9880d681SAndroid Build Coastguard Worker; CHECK: retq
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker entry:
67*9880d681SAndroid Build Coastguard Worker  %c = icmp eq i32* %x, null
68*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %is_null, label %not_null, !make.implicit !0
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker is_null:
71*9880d681SAndroid Build Coastguard Worker  ret i32 42
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker not_null:
74*9880d681SAndroid Build Coastguard Worker  %t = load i32, i32* %x
75*9880d681SAndroid Build Coastguard Worker  %p1 = add i32 %t, %p
76*9880d681SAndroid Build Coastguard Worker  ret i32 %p1
77*9880d681SAndroid Build Coastguard Worker}
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workerdefine i32 @imp_null_check_hoist_over_unrelated_load(i32* %x, i32* %y, i32* %z) {
80*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _imp_null_check_hoist_over_unrelated_load:
81*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB0_imp_null_check_hoist_over_unrelated_load:L[^:]+]]:
82*9880d681SAndroid Build Coastguard Worker; CHECK: movl (%rdi), %eax
83*9880d681SAndroid Build Coastguard Worker; CHECK: movl (%rsi), %ecx
84*9880d681SAndroid Build Coastguard Worker; CHECK: movl %ecx, (%rdx)
85*9880d681SAndroid Build Coastguard Worker; CHECK: retq
86*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB1_imp_null_check_hoist_over_unrelated_load:LBB3_[0-9]+]]:
87*9880d681SAndroid Build Coastguard Worker; CHECK: movl	$42, %eax
88*9880d681SAndroid Build Coastguard Worker; CHECK: retq
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker entry:
91*9880d681SAndroid Build Coastguard Worker  %c = icmp eq i32* %x, null
92*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %is_null, label %not_null, !make.implicit !0
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker is_null:
95*9880d681SAndroid Build Coastguard Worker  ret i32 42
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Worker not_null:
98*9880d681SAndroid Build Coastguard Worker  %t0 = load i32, i32* %y
99*9880d681SAndroid Build Coastguard Worker  %t1 = load i32, i32* %x
100*9880d681SAndroid Build Coastguard Worker  store i32 %t0, i32* %z
101*9880d681SAndroid Build Coastguard Worker  ret i32 %t1
102*9880d681SAndroid Build Coastguard Worker}
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Workerdefine i32 @imp_null_check_via_mem_comparision(i32* %x, i32 %val) {
105*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _imp_null_check_via_mem_comparision
106*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB0_imp_null_check_via_mem_comparision:L[^:]+]]:
107*9880d681SAndroid Build Coastguard Worker; CHECK: cmpl   %esi, 4(%rdi)
108*9880d681SAndroid Build Coastguard Worker; CHECK: jge    LBB4_2
109*9880d681SAndroid Build Coastguard Worker; CHECK: movl   $100, %eax
110*9880d681SAndroid Build Coastguard Worker; CHECK: retq
111*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB1_imp_null_check_via_mem_comparision:LBB4_[0-9]+]]:
112*9880d681SAndroid Build Coastguard Worker; CHECK: movl   $42, %eax
113*9880d681SAndroid Build Coastguard Worker; CHECK: retq
114*9880d681SAndroid Build Coastguard Worker; CHECK: LBB4_2:
115*9880d681SAndroid Build Coastguard Worker; CHECK: movl   $200, %eax
116*9880d681SAndroid Build Coastguard Worker; CHECK: retq
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker entry:
119*9880d681SAndroid Build Coastguard Worker  %c = icmp eq i32* %x, null
120*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %is_null, label %not_null, !make.implicit !0
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker is_null:
123*9880d681SAndroid Build Coastguard Worker  ret i32 42
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Worker not_null:
126*9880d681SAndroid Build Coastguard Worker  %x.loc = getelementptr i32, i32* %x, i32 1
127*9880d681SAndroid Build Coastguard Worker  %t = load i32, i32* %x.loc
128*9880d681SAndroid Build Coastguard Worker  %m = icmp slt i32 %t, %val
129*9880d681SAndroid Build Coastguard Worker  br i1 %m, label %ret_100, label %ret_200
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker ret_100:
132*9880d681SAndroid Build Coastguard Worker  ret i32 100
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker ret_200:
135*9880d681SAndroid Build Coastguard Worker  ret i32 200
136*9880d681SAndroid Build Coastguard Worker}
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Worker!0 = !{}
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: __LLVM_FaultMaps:
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Worker; Version:
143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .byte 1
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker; Reserved x2
146*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .byte 0
147*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .short 0
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Worker; # functions:
150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 5
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Worker; FunctionAddr:
153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad _imp_null_check_add_result
154*9880d681SAndroid Build Coastguard Worker; NumFaultingPCs
155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 1
156*9880d681SAndroid Build Coastguard Worker; Reserved:
157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 0
158*9880d681SAndroid Build Coastguard Worker; Fault[0].Type:
159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 1
160*9880d681SAndroid Build Coastguard Worker; Fault[0].FaultOffset:
161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long [[BB0_imp_null_check_add_result]]-_imp_null_check_add_result
162*9880d681SAndroid Build Coastguard Worker; Fault[0].HandlerOffset:
163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long [[BB1_imp_null_check_add_result]]-_imp_null_check_add_result
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker; FunctionAddr:
166*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad _imp_null_check_gep_load
167*9880d681SAndroid Build Coastguard Worker; NumFaultingPCs
168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 1
169*9880d681SAndroid Build Coastguard Worker; Reserved:
170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 0
171*9880d681SAndroid Build Coastguard Worker; Fault[0].Type:
172*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 1
173*9880d681SAndroid Build Coastguard Worker; Fault[0].FaultOffset:
174*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long [[BB0_imp_null_check_gep_load]]-_imp_null_check_gep_load
175*9880d681SAndroid Build Coastguard Worker; Fault[0].HandlerOffset:
176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long [[BB1_imp_null_check_gep_load]]-_imp_null_check_gep_load
177*9880d681SAndroid Build Coastguard Worker
178*9880d681SAndroid Build Coastguard Worker; FunctionAddr:
179*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad _imp_null_check_hoist_over_unrelated_load
180*9880d681SAndroid Build Coastguard Worker; NumFaultingPCs
181*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 1
182*9880d681SAndroid Build Coastguard Worker; Reserved:
183*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 0
184*9880d681SAndroid Build Coastguard Worker; Fault[0].Type:
185*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 1
186*9880d681SAndroid Build Coastguard Worker; Fault[0].FaultOffset:
187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long [[BB0_imp_null_check_hoist_over_unrelated_load]]-_imp_null_check_hoist_over_unrelated_load
188*9880d681SAndroid Build Coastguard Worker; Fault[0].HandlerOffset:
189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long [[BB1_imp_null_check_hoist_over_unrelated_load]]-_imp_null_check_hoist_over_unrelated_load
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Worker; FunctionAddr:
192*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad _imp_null_check_load
193*9880d681SAndroid Build Coastguard Worker; NumFaultingPCs
194*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 1
195*9880d681SAndroid Build Coastguard Worker; Reserved:
196*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 0
197*9880d681SAndroid Build Coastguard Worker; Fault[0].Type:
198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 1
199*9880d681SAndroid Build Coastguard Worker; Fault[0].FaultOffset:
200*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long [[BB0_imp_null_check_load]]-_imp_null_check_load
201*9880d681SAndroid Build Coastguard Worker; Fault[0].HandlerOffset:
202*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long [[BB1_imp_null_check_load]]-_imp_null_check_load
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Worker; FunctionAddr:
205*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .quad     _imp_null_check_via_mem_comparision
206*9880d681SAndroid Build Coastguard Worker; NumFaultingPCs
207*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long   1
208*9880d681SAndroid Build Coastguard Worker; Reserved:
209*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long   0
210*9880d681SAndroid Build Coastguard Worker; Fault[0].Type:
211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long   1
212*9880d681SAndroid Build Coastguard Worker; Fault[0].FaultOffset:
213*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long   [[BB0_imp_null_check_via_mem_comparision]]-_imp_null_check_via_mem_comparision
214*9880d681SAndroid Build Coastguard Worker; Fault[0].HandlerOffset:
215*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long   [[BB1_imp_null_check_via_mem_comparision]]-_imp_null_check_via_mem_comparision
216*9880d681SAndroid Build Coastguard Worker
217*9880d681SAndroid Build Coastguard Worker; OBJDUMP: FaultMap table:
218*9880d681SAndroid Build Coastguard Worker; OBJDUMP-NEXT: Version: 0x1
219*9880d681SAndroid Build Coastguard Worker; OBJDUMP-NEXT: NumFunctions: 5
220*9880d681SAndroid Build Coastguard Worker; OBJDUMP-NEXT: FunctionAddress: 0x000000, NumFaultingPCs: 1
221*9880d681SAndroid Build Coastguard Worker; OBJDUMP-NEXT: Fault kind: FaultingLoad, faulting PC offset: 0, handling PC offset: 5
222*9880d681SAndroid Build Coastguard Worker; OBJDUMP-NEXT: FunctionAddress: 0x000000, NumFaultingPCs: 1
223*9880d681SAndroid Build Coastguard Worker; OBJDUMP-NEXT: Fault kind: FaultingLoad, faulting PC offset: 0, handling PC offset: 7
224*9880d681SAndroid Build Coastguard Worker; OBJDUMP-NEXT: FunctionAddress: 0x000000, NumFaultingPCs: 1
225*9880d681SAndroid Build Coastguard Worker; OBJDUMP-NEXT: Fault kind: FaultingLoad, faulting PC offset: 0, handling PC offset: 7
226*9880d681SAndroid Build Coastguard Worker; OBJDUMP-NEXT: FunctionAddress: 0x000000, NumFaultingPCs: 1
227*9880d681SAndroid Build Coastguard Worker; OBJDUMP-NEXT: Fault kind: FaultingLoad, faulting PC offset: 0, handling PC offset: 3
228