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