xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/implicit-null-checks.mir (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker# RUN: llc -run-pass implicit-null-checks -mtriple=x86_64-apple-macosx -o - %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker--- |
4*9880d681SAndroid Build Coastguard Worker  target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
5*9880d681SAndroid Build Coastguard Worker  target triple = "x86_64-apple-macosx"
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker  ;; Positive test
8*9880d681SAndroid Build Coastguard Worker  define i32 @imp_null_check_with_bitwise_op_0(i32* %x, i32 %val) {
9*9880d681SAndroid Build Coastguard Worker  entry:
10*9880d681SAndroid Build Coastguard Worker    br i1 undef, label %is_null, label %not_null, !make.implicit !0
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker  is_null:
13*9880d681SAndroid Build Coastguard Worker    ret i32 42
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker  not_null:
16*9880d681SAndroid Build Coastguard Worker    br i1 undef, label %ret_100, label %ret_200
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker  ret_100:
19*9880d681SAndroid Build Coastguard Worker    ret i32 100
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker  ret_200:
22*9880d681SAndroid Build Coastguard Worker    ret i32 200
23*9880d681SAndroid Build Coastguard Worker  }
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker  ;; Negative test.  The regalloc is such that we cannot hoist the
26*9880d681SAndroid Build Coastguard Worker  ;; instruction materializing 2200000 into %eax
27*9880d681SAndroid Build Coastguard Worker  define i32 @imp_null_check_with_bitwise_op_1(i32* %x, i32 %val, i32* %ptr) {
28*9880d681SAndroid Build Coastguard Worker  entry:
29*9880d681SAndroid Build Coastguard Worker    br i1 undef, label %is_null, label %not_null, !make.implicit !0
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker  is_null:
32*9880d681SAndroid Build Coastguard Worker    ret i32 undef
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker  not_null:
35*9880d681SAndroid Build Coastguard Worker    br i1 undef, label %ret_100, label %ret_200
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker  ret_100:
38*9880d681SAndroid Build Coastguard Worker    ret i32 100
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker  ret_200:
41*9880d681SAndroid Build Coastguard Worker    ret i32 200
42*9880d681SAndroid Build Coastguard Worker  }
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker  ;; Negative test: IR is identical to
45*9880d681SAndroid Build Coastguard Worker  ;; @imp_null_check_with_bitwise_op_0 but MIR differs.
46*9880d681SAndroid Build Coastguard Worker  define i32 @imp_null_check_with_bitwise_op_2(i32* %x, i32 %val) {
47*9880d681SAndroid Build Coastguard Worker  entry:
48*9880d681SAndroid Build Coastguard Worker    br i1 undef, label %is_null, label %not_null, !make.implicit !0
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker  is_null:
51*9880d681SAndroid Build Coastguard Worker    ret i32 42
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker  not_null:
54*9880d681SAndroid Build Coastguard Worker    br i1 undef, label %ret_100, label %ret_200
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker  ret_100:
57*9880d681SAndroid Build Coastguard Worker    ret i32 100
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker  ret_200:
60*9880d681SAndroid Build Coastguard Worker    ret i32 200
61*9880d681SAndroid Build Coastguard Worker  }
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker  ;; Negative test: IR is identical to
64*9880d681SAndroid Build Coastguard Worker  ;; @imp_null_check_with_bitwise_op_0 but MIR differs.
65*9880d681SAndroid Build Coastguard Worker  define i32 @imp_null_check_with_bitwise_op_3(i32* %x, i32 %val) {
66*9880d681SAndroid Build Coastguard Worker  entry:
67*9880d681SAndroid Build Coastguard Worker    br i1 undef, label %is_null, label %not_null, !make.implicit !0
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker  is_null:
70*9880d681SAndroid Build Coastguard Worker    ret i32 42
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker  not_null:
73*9880d681SAndroid Build Coastguard Worker    br i1 undef, label %ret_100, label %ret_200
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker  ret_100:
76*9880d681SAndroid Build Coastguard Worker    ret i32 100
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker  ret_200:
79*9880d681SAndroid Build Coastguard Worker    ret i32 200
80*9880d681SAndroid Build Coastguard Worker  }
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker  !0 = !{}
83*9880d681SAndroid Build Coastguard Worker...
84*9880d681SAndroid Build Coastguard Worker---
85*9880d681SAndroid Build Coastguard Workername:            imp_null_check_with_bitwise_op_0
86*9880d681SAndroid Build Coastguard Worker# CHECK-LABEL: name:            imp_null_check_with_bitwise_op_0
87*9880d681SAndroid Build Coastguard Workeralignment:       4
88*9880d681SAndroid Build Coastguard WorkerallVRegsAllocated: true
89*9880d681SAndroid Build Coastguard WorkertracksRegLiveness: true
90*9880d681SAndroid Build Coastguard WorkertracksSubRegLiveness: false
91*9880d681SAndroid Build Coastguard Workerliveins:
92*9880d681SAndroid Build Coastguard Worker  - { reg: '%rdi' }
93*9880d681SAndroid Build Coastguard Worker  - { reg: '%esi' }
94*9880d681SAndroid Build Coastguard Worker# CHECK:  bb.0.entry:
95*9880d681SAndroid Build Coastguard Worker# CHECK:    %eax = MOV32ri 2200000
96*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:    %eax = FAULTING_LOAD_OP %bb.3.is_null, {{[0-9]+}}, killed %eax, killed %rdi, 1, _, 0, _, implicit-def dead %eflags :: (load 4 from %ir.x)
97*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:    JMP_1 %bb.1.not_null
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Workerbody:             |
100*9880d681SAndroid Build Coastguard Worker  bb.0.entry:
101*9880d681SAndroid Build Coastguard Worker    successors: %bb.3.is_null, %bb.1.not_null
102*9880d681SAndroid Build Coastguard Worker    liveins: %esi, %rdi
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker    TEST64rr %rdi, %rdi, implicit-def %eflags
105*9880d681SAndroid Build Coastguard Worker    JE_1 %bb.3.is_null, implicit %eflags
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Worker  bb.1.not_null:
108*9880d681SAndroid Build Coastguard Worker    successors: %bb.4.ret_100, %bb.2.ret_200
109*9880d681SAndroid Build Coastguard Worker    liveins: %esi, %rdi
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker    %eax = MOV32ri 2200000
112*9880d681SAndroid Build Coastguard Worker    %eax = AND32rm killed %eax, killed %rdi, 1, _, 0, _, implicit-def dead %eflags :: (load 4 from %ir.x)
113*9880d681SAndroid Build Coastguard Worker    CMP32rr killed %eax, killed %esi, implicit-def %eflags
114*9880d681SAndroid Build Coastguard Worker    JE_1 %bb.4.ret_100, implicit %eflags
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker  bb.2.ret_200:
117*9880d681SAndroid Build Coastguard Worker    %eax = MOV32ri 200
118*9880d681SAndroid Build Coastguard Worker    RET 0, %eax
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Worker  bb.3.is_null:
121*9880d681SAndroid Build Coastguard Worker    %eax = MOV32ri 42
122*9880d681SAndroid Build Coastguard Worker    RET 0, %eax
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker  bb.4.ret_100:
125*9880d681SAndroid Build Coastguard Worker    %eax = MOV32ri 100
126*9880d681SAndroid Build Coastguard Worker    RET 0, %eax
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker...
129*9880d681SAndroid Build Coastguard Worker---
130*9880d681SAndroid Build Coastguard Workername:            imp_null_check_with_bitwise_op_1
131*9880d681SAndroid Build Coastguard Workeralignment:       4
132*9880d681SAndroid Build Coastguard WorkerallVRegsAllocated: true
133*9880d681SAndroid Build Coastguard WorkerisSSA:           false
134*9880d681SAndroid Build Coastguard WorkertracksRegLiveness: true
135*9880d681SAndroid Build Coastguard WorkertracksSubRegLiveness: false
136*9880d681SAndroid Build Coastguard Workerliveins:
137*9880d681SAndroid Build Coastguard Worker  - { reg: '%rdi' }
138*9880d681SAndroid Build Coastguard Worker  - { reg: '%esi' }
139*9880d681SAndroid Build Coastguard Worker  - { reg: '%rdx' }
140*9880d681SAndroid Build Coastguard Worker# CHECK: bb.0.entry:
141*9880d681SAndroid Build Coastguard Worker# CHECK:    %eax = MOV32rm killed %rdx, 1, _, 0, _ :: (volatile load 4 from %ir.ptr)
142*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:    TEST64rr %rdi, %rdi, implicit-def %eflags
143*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:    JE_1 %bb.3.is_null, implicit %eflags
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Workerbody:             |
146*9880d681SAndroid Build Coastguard Worker  bb.0.entry:
147*9880d681SAndroid Build Coastguard Worker    successors: %bb.3.is_null, %bb.1.not_null
148*9880d681SAndroid Build Coastguard Worker    liveins: %esi, %rdi, %rdx
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Worker    %eax = MOV32rm killed %rdx, 1, _, 0, _ :: (volatile load 4 from %ir.ptr)
151*9880d681SAndroid Build Coastguard Worker    TEST64rr %rdi, %rdi, implicit-def %eflags
152*9880d681SAndroid Build Coastguard Worker    JE_1 %bb.3.is_null, implicit %eflags
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Worker  bb.1.not_null:
155*9880d681SAndroid Build Coastguard Worker    successors: %bb.4.ret_100, %bb.2.ret_200
156*9880d681SAndroid Build Coastguard Worker    liveins: %esi, %rdi
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Worker    %eax = MOV32ri 2200000
159*9880d681SAndroid Build Coastguard Worker    %eax = AND32rm killed %eax, killed %rdi, 1, _, 0, _, implicit-def dead %eflags :: (load 4 from %ir.x)
160*9880d681SAndroid Build Coastguard Worker    CMP32rr killed %eax, killed %esi, implicit-def %eflags
161*9880d681SAndroid Build Coastguard Worker    JE_1 %bb.4.ret_100, implicit %eflags
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Worker  bb.2.ret_200:
164*9880d681SAndroid Build Coastguard Worker    successors: %bb.3.is_null
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Worker    %eax = MOV32ri 200
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker  bb.3.is_null:
169*9880d681SAndroid Build Coastguard Worker    liveins: %eax, %ah, %al, %ax, %bh, %bl, %bp, %bpl, %bx, %eax, %ebp, %ebx, %rax, %rbp, %rbx, %r12, %r13, %r14, %r15, %r12b, %r13b, %r14b, %r15b, %r12d, %r13d, %r14d, %r15d, %r12w, %r13w, %r14w, %r15w
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker    RET 0, %eax
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Worker  bb.4.ret_100:
174*9880d681SAndroid Build Coastguard Worker    %eax = MOV32ri 100
175*9880d681SAndroid Build Coastguard Worker    RET 0, %eax
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Worker...
178*9880d681SAndroid Build Coastguard Worker---
179*9880d681SAndroid Build Coastguard Workername:            imp_null_check_with_bitwise_op_2
180*9880d681SAndroid Build Coastguard Worker# CHECK-LABEL: name:            imp_null_check_with_bitwise_op_2
181*9880d681SAndroid Build Coastguard Workeralignment:       4
182*9880d681SAndroid Build Coastguard WorkerallVRegsAllocated: true
183*9880d681SAndroid Build Coastguard WorkertracksRegLiveness: true
184*9880d681SAndroid Build Coastguard WorkertracksSubRegLiveness: false
185*9880d681SAndroid Build Coastguard Workerliveins:
186*9880d681SAndroid Build Coastguard Worker  - { reg: '%rdi' }
187*9880d681SAndroid Build Coastguard Worker  - { reg: '%esi' }
188*9880d681SAndroid Build Coastguard Worker# CHECK:  bb.0.entry:
189*9880d681SAndroid Build Coastguard Worker# CHECK:    TEST64rr %rdi, %rdi, implicit-def %eflags
190*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:    JE_1 %bb.3.is_null, implicit %eflags
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Workerbody:             |
193*9880d681SAndroid Build Coastguard Worker  bb.0.entry:
194*9880d681SAndroid Build Coastguard Worker    successors: %bb.3.is_null, %bb.1.not_null
195*9880d681SAndroid Build Coastguard Worker    liveins: %esi, %rdi
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Worker    TEST64rr %rdi, %rdi, implicit-def %eflags
198*9880d681SAndroid Build Coastguard Worker    JE_1 %bb.3.is_null, implicit %eflags
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Worker  bb.1.not_null:
201*9880d681SAndroid Build Coastguard Worker    successors: %bb.4.ret_100, %bb.2.ret_200
202*9880d681SAndroid Build Coastguard Worker    liveins: %esi, %rdi
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Worker    %eax = MOV32ri 2200000
205*9880d681SAndroid Build Coastguard Worker    %eax = ADD32ri killed %eax, 100, implicit-def dead %eflags
206*9880d681SAndroid Build Coastguard Worker    %eax = AND32rm killed %eax, killed %rdi, 1, _, 0, _, implicit-def dead %eflags :: (load 4 from %ir.x)
207*9880d681SAndroid Build Coastguard Worker    CMP32rr killed %eax, killed %esi, implicit-def %eflags
208*9880d681SAndroid Build Coastguard Worker    JE_1 %bb.4.ret_100, implicit %eflags
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Worker  bb.2.ret_200:
211*9880d681SAndroid Build Coastguard Worker    %eax = MOV32ri 200
212*9880d681SAndroid Build Coastguard Worker    RET 0, %eax
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard Worker  bb.3.is_null:
215*9880d681SAndroid Build Coastguard Worker    %eax = MOV32ri 42
216*9880d681SAndroid Build Coastguard Worker    RET 0, %eax
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Worker  bb.4.ret_100:
219*9880d681SAndroid Build Coastguard Worker    %eax = MOV32ri 100
220*9880d681SAndroid Build Coastguard Worker    RET 0, %eax
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard Worker...
223*9880d681SAndroid Build Coastguard Worker---
224*9880d681SAndroid Build Coastguard Workername:            imp_null_check_with_bitwise_op_3
225*9880d681SAndroid Build Coastguard Worker# CHECK-LABEL: name:            imp_null_check_with_bitwise_op_3
226*9880d681SAndroid Build Coastguard Workeralignment:       4
227*9880d681SAndroid Build Coastguard WorkerallVRegsAllocated: true
228*9880d681SAndroid Build Coastguard WorkertracksRegLiveness: true
229*9880d681SAndroid Build Coastguard WorkertracksSubRegLiveness: false
230*9880d681SAndroid Build Coastguard Workerliveins:
231*9880d681SAndroid Build Coastguard Worker  - { reg: '%rdi' }
232*9880d681SAndroid Build Coastguard Worker  - { reg: '%rsi' }
233*9880d681SAndroid Build Coastguard Worker# CHECK:  bb.0.entry:
234*9880d681SAndroid Build Coastguard Worker# CHECK:    TEST64rr %rdi, %rdi, implicit-def %eflags
235*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:    JE_1 %bb.3.is_null, implicit %eflags
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Workerbody:             |
238*9880d681SAndroid Build Coastguard Worker  bb.0.entry:
239*9880d681SAndroid Build Coastguard Worker    successors: %bb.3.is_null, %bb.1.not_null
240*9880d681SAndroid Build Coastguard Worker    liveins: %rsi, %rdi
241*9880d681SAndroid Build Coastguard Worker
242*9880d681SAndroid Build Coastguard Worker    TEST64rr %rdi, %rdi, implicit-def %eflags
243*9880d681SAndroid Build Coastguard Worker    JE_1 %bb.3.is_null, implicit %eflags
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Worker  bb.1.not_null:
246*9880d681SAndroid Build Coastguard Worker    successors: %bb.4.ret_100, %bb.2.ret_200
247*9880d681SAndroid Build Coastguard Worker    liveins: %rsi, %rdi
248*9880d681SAndroid Build Coastguard Worker
249*9880d681SAndroid Build Coastguard Worker    %rdi  = MOV64ri 5000
250*9880d681SAndroid Build Coastguard Worker    %rdi = AND64rm killed %rdi, killed %rdi, 1, _, 0, _, implicit-def dead %eflags :: (load 4 from %ir.x)
251*9880d681SAndroid Build Coastguard Worker    CMP64rr killed %rdi, killed %rsi, implicit-def %eflags
252*9880d681SAndroid Build Coastguard Worker    JE_1 %bb.4.ret_100, implicit %eflags
253*9880d681SAndroid Build Coastguard Worker
254*9880d681SAndroid Build Coastguard Worker  bb.2.ret_200:
255*9880d681SAndroid Build Coastguard Worker    %eax = MOV32ri 200
256*9880d681SAndroid Build Coastguard Worker    RET 0, %eax
257*9880d681SAndroid Build Coastguard Worker
258*9880d681SAndroid Build Coastguard Worker  bb.3.is_null:
259*9880d681SAndroid Build Coastguard Worker    %eax = MOV32ri 42
260*9880d681SAndroid Build Coastguard Worker    RET 0, %eax
261*9880d681SAndroid Build Coastguard Worker
262*9880d681SAndroid Build Coastguard Worker  bb.4.ret_100:
263*9880d681SAndroid Build Coastguard Worker    %eax = MOV32ri 100
264*9880d681SAndroid Build Coastguard Worker    RET 0, %eax
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard Worker...
267