1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -mcpu=corei7 -verify-machineinstrs | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine void @test(i8** %a, i64* %b, i64 %c, i64 %d) nounwind { 4*9880d681SAndroid Build Coastguard Workerentry: 5*9880d681SAndroid Build Coastguard Worker %ptrtoarg4 = load i8*, i8** %a, align 8 6*9880d681SAndroid Build Coastguard Worker %brglist1 = getelementptr i8*, i8** %a, i64 1 7*9880d681SAndroid Build Coastguard Worker %ptrtoarg25 = load i8*, i8** %brglist1, align 8 8*9880d681SAndroid Build Coastguard Worker %0 = load i64, i64* %b, align 8 9*9880d681SAndroid Build Coastguard Worker %1 = mul i64 %0, 4 10*9880d681SAndroid Build Coastguard Worker %scevgep = getelementptr i8, i8* %ptrtoarg25, i64 %1 11*9880d681SAndroid Build Coastguard Worker %2 = mul i64 %d, 4 12*9880d681SAndroid Build Coastguard Worker br label %loop.cond 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerloop.cond: ; preds = %test.exit, %entry 15*9880d681SAndroid Build Coastguard Worker %asr.iv6 = phi i8* [ %29, %test.exit ], [ %scevgep, %entry ] 16*9880d681SAndroid Build Coastguard Worker %iv = phi i64 [ %0, %entry ], [ %28, %test.exit ] 17*9880d681SAndroid Build Coastguard Worker %3 = icmp eq i64 %iv, %c 18*9880d681SAndroid Build Coastguard Worker br i1 %3, label %return, label %loop 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerloop: ; preds = %loop.cond 21*9880d681SAndroid Build Coastguard Worker %4 = load i64*, i64* addrspace(256)* inttoptr (i64 264 to i64* addrspace(256)*), align 8 22*9880d681SAndroid Build Coastguard Worker %5 = load i64, i64* %4, align 8 23*9880d681SAndroid Build Coastguard Worker %vector.size.i = ashr i64 %5, 3 24*9880d681SAndroid Build Coastguard Worker %num.vector.wi.i = shl i64 %vector.size.i, 3 25*9880d681SAndroid Build Coastguard Worker %6 = icmp eq i64 %vector.size.i, 0 26*9880d681SAndroid Build Coastguard Worker br i1 %6, label %scalarIf.i, label %dim_0_vector_pre_head.i 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerdim_0_vector_pre_head.i: ; preds = %loop 29*9880d681SAndroid Build Coastguard Worker %7 = trunc i64 %5 to i32 30*9880d681SAndroid Build Coastguard Worker %tempvector_func.i = insertelement <8 x i32> undef, i32 %7, i32 0 31*9880d681SAndroid Build Coastguard Worker %vectorvector_func.i = shufflevector <8 x i32> %tempvector_func.i, <8 x i32> undef, <8 x i32> zeroinitializer 32*9880d681SAndroid Build Coastguard Worker br label %vector_kernel_entry.i 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workervector_kernel_entry.i: ; preds = %vector_kernel_entry.i, %dim_0_vector_pre_head.i 35*9880d681SAndroid Build Coastguard Worker %asr.iv9 = phi i8* [ %scevgep10, %vector_kernel_entry.i ], [ %asr.iv6, %dim_0_vector_pre_head.i ] 36*9880d681SAndroid Build Coastguard Worker %asr.iv = phi i64 [ %asr.iv.next, %vector_kernel_entry.i ], [ %vector.size.i, %dim_0_vector_pre_head.i ] 37*9880d681SAndroid Build Coastguard Worker %8 = addrspacecast i8* %ptrtoarg4 to i32 addrspace(1)* 38*9880d681SAndroid Build Coastguard Worker %asr.iv911 = addrspacecast i8* %asr.iv9 to <8 x i32> addrspace(1)* 39*9880d681SAndroid Build Coastguard Worker %9 = load <8 x i32>, <8 x i32> addrspace(1)* %asr.iv911, align 4 40*9880d681SAndroid Build Coastguard Worker %extract8vector_func.i = extractelement <8 x i32> %9, i32 0 41*9880d681SAndroid Build Coastguard Worker %extract9vector_func.i = extractelement <8 x i32> %9, i32 1 42*9880d681SAndroid Build Coastguard Worker %extract10vector_func.i = extractelement <8 x i32> %9, i32 2 43*9880d681SAndroid Build Coastguard Worker %extract11vector_func.i = extractelement <8 x i32> %9, i32 3 44*9880d681SAndroid Build Coastguard Worker %extract12vector_func.i = extractelement <8 x i32> %9, i32 4 45*9880d681SAndroid Build Coastguard Worker %extract13vector_func.i = extractelement <8 x i32> %9, i32 5 46*9880d681SAndroid Build Coastguard Worker %extract14vector_func.i = extractelement <8 x i32> %9, i32 6 47*9880d681SAndroid Build Coastguard Worker %extract15vector_func.i = extractelement <8 x i32> %9, i32 7 48*9880d681SAndroid Build Coastguard Worker %10 = atomicrmw min i32 addrspace(1)* %8, i32 %extract8vector_func.i seq_cst 49*9880d681SAndroid Build Coastguard Worker %11 = atomicrmw min i32 addrspace(1)* %8, i32 %extract9vector_func.i seq_cst 50*9880d681SAndroid Build Coastguard Worker %12 = atomicrmw min i32 addrspace(1)* %8, i32 %extract10vector_func.i seq_cst 51*9880d681SAndroid Build Coastguard Worker %13 = atomicrmw min i32 addrspace(1)* %8, i32 %extract11vector_func.i seq_cst 52*9880d681SAndroid Build Coastguard Worker %14 = atomicrmw min i32 addrspace(1)* %8, i32 %extract12vector_func.i seq_cst 53*9880d681SAndroid Build Coastguard Worker %15 = atomicrmw min i32 addrspace(1)* %8, i32 %extract13vector_func.i seq_cst 54*9880d681SAndroid Build Coastguard Worker %16 = atomicrmw min i32 addrspace(1)* %8, i32 %extract14vector_func.i seq_cst 55*9880d681SAndroid Build Coastguard Worker %17 = atomicrmw min i32 addrspace(1)* %8, i32 %extract15vector_func.i seq_cst 56*9880d681SAndroid Build Coastguard Worker store <8 x i32> %vectorvector_func.i, <8 x i32> addrspace(1)* %asr.iv911, align 4 57*9880d681SAndroid Build Coastguard Worker %asr.iv.next = add i64 %asr.iv, -1 58*9880d681SAndroid Build Coastguard Worker %scevgep10 = getelementptr i8, i8* %asr.iv9, i64 32 59*9880d681SAndroid Build Coastguard Worker %dim_0_vector_cmp.to.max.i = icmp eq i64 %asr.iv.next, 0 60*9880d681SAndroid Build Coastguard Worker br i1 %dim_0_vector_cmp.to.max.i, label %scalarIf.i, label %vector_kernel_entry.i 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard WorkerscalarIf.i: ; preds = %vector_kernel_entry.i, %loop 63*9880d681SAndroid Build Coastguard Worker %exec_wi.i = phi i64 [ 0, %loop ], [ %num.vector.wi.i, %vector_kernel_entry.i ] 64*9880d681SAndroid Build Coastguard Worker %18 = icmp eq i64 %exec_wi.i, %5 65*9880d681SAndroid Build Coastguard Worker br i1 %18, label %test.exit, label %dim_0_pre_head.i 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerdim_0_pre_head.i: ; preds = %scalarIf.i 68*9880d681SAndroid Build Coastguard Worker %19 = load i64*, i64* addrspace(256)* inttoptr (i64 264 to i64* addrspace(256)*), align 8 69*9880d681SAndroid Build Coastguard Worker %20 = load i64, i64* %19, align 8 70*9880d681SAndroid Build Coastguard Worker %21 = trunc i64 %20 to i32 71*9880d681SAndroid Build Coastguard Worker %22 = mul i64 %vector.size.i, 8 72*9880d681SAndroid Build Coastguard Worker br label %scalar_kernel_entry.i 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerscalar_kernel_entry.i: ; preds = %scalar_kernel_entry.i, %dim_0_pre_head.i 75*9880d681SAndroid Build Coastguard Worker %asr.iv12 = phi i64 [ %asr.iv.next13, %scalar_kernel_entry.i ], [ %22, %dim_0_pre_head.i ] 76*9880d681SAndroid Build Coastguard Worker %23 = addrspacecast i8* %asr.iv6 to i32 addrspace(1)* 77*9880d681SAndroid Build Coastguard Worker %24 = addrspacecast i8* %ptrtoarg4 to i32 addrspace(1)* 78*9880d681SAndroid Build Coastguard Worker %scevgep16 = getelementptr i32, i32 addrspace(1)* %23, i64 %asr.iv12 79*9880d681SAndroid Build Coastguard Worker %25 = load i32, i32 addrspace(1)* %scevgep16, align 4 80*9880d681SAndroid Build Coastguard Worker %26 = atomicrmw min i32 addrspace(1)* %24, i32 %25 seq_cst 81*9880d681SAndroid Build Coastguard Worker %scevgep15 = getelementptr i32, i32 addrspace(1)* %23, i64 %asr.iv12 82*9880d681SAndroid Build Coastguard Worker store i32 %21, i32 addrspace(1)* %scevgep15, align 4 83*9880d681SAndroid Build Coastguard Worker %asr.iv.next13 = add i64 %asr.iv12, 1 84*9880d681SAndroid Build Coastguard Worker %dim_0_cmp.to.max.i = icmp eq i64 %5, %asr.iv.next13 85*9880d681SAndroid Build Coastguard Worker br i1 %dim_0_cmp.to.max.i, label %test.exit, label %scalar_kernel_entry.i 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workertest.exit: ; preds = %scalar_kernel_entry.i, %scalarIf.i 88*9880d681SAndroid Build Coastguard Worker %27 = bitcast i8* %asr.iv6 to i1* 89*9880d681SAndroid Build Coastguard Worker %28 = add i64 %iv, %d 90*9880d681SAndroid Build Coastguard Worker store i64 %28, i64* %b, align 8 91*9880d681SAndroid Build Coastguard Worker %scevgep8 = getelementptr i1, i1* %27, i64 %2 92*9880d681SAndroid Build Coastguard Worker %29 = bitcast i1* %scevgep8 to i8* 93*9880d681SAndroid Build Coastguard Worker br label %loop.cond 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %loop.cond 96*9880d681SAndroid Build Coastguard Worker store i64 %0, i64* %b, align 8 97*9880d681SAndroid Build Coastguard Worker ret void 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker; CHECK: test 101*9880d681SAndroid Build Coastguard Worker; CHECK: decq 102*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmpxchgl 103*9880d681SAndroid Build Coastguard Worker; CHECK: jne 104*9880d681SAndroid Build Coastguard Worker; CHECK: ret 105