1*9880d681SAndroid Build Coastguard Worker; RUN: llc -O0 -fast-isel-abort=1 -mtriple=arm64-apple-darwin -mcpu=cyclone -verify-machineinstrs < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine void @branch1() nounwind uwtable ssp { 4*9880d681SAndroid Build Coastguard Worker %x = alloca i32, align 4 5*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %x, align 4 6*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* %x, align 4 7*9880d681SAndroid Build Coastguard Worker %2 = icmp ne i32 %1, 0 8*9880d681SAndroid Build Coastguard Worker br i1 %2, label %3, label %4 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker; <label>:3 ; preds = %0 11*9880d681SAndroid Build Coastguard Worker br label %4 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; <label>:4 ; preds = %3, %0 14*9880d681SAndroid Build Coastguard Worker ret void 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerdefine void @branch2() nounwind uwtable ssp { 18*9880d681SAndroid Build Coastguard Worker %1 = alloca i32, align 4 19*9880d681SAndroid Build Coastguard Worker %x = alloca i32, align 4 20*9880d681SAndroid Build Coastguard Worker %y = alloca i32, align 4 21*9880d681SAndroid Build Coastguard Worker %z = alloca i32, align 4 22*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %1 23*9880d681SAndroid Build Coastguard Worker store i32 1, i32* %y, align 4 24*9880d681SAndroid Build Coastguard Worker store i32 1, i32* %x, align 4 25*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %z, align 4 26*9880d681SAndroid Build Coastguard Worker %2 = load i32, i32* %x, align 4 27*9880d681SAndroid Build Coastguard Worker %3 = icmp ne i32 %2, 0 28*9880d681SAndroid Build Coastguard Worker br i1 %3, label %4, label %5 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker; <label>:4 ; preds = %0 31*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %1 32*9880d681SAndroid Build Coastguard Worker br label %14 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; <label>:5 ; preds = %0 35*9880d681SAndroid Build Coastguard Worker %6 = load i32, i32* %y, align 4 36*9880d681SAndroid Build Coastguard Worker %7 = icmp ne i32 %6, 0 37*9880d681SAndroid Build Coastguard Worker br i1 %7, label %8, label %13 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker; <label>:8 ; preds = %5 40*9880d681SAndroid Build Coastguard Worker %9 = load i32, i32* %z, align 4 41*9880d681SAndroid Build Coastguard Worker %10 = icmp ne i32 %9, 0 42*9880d681SAndroid Build Coastguard Worker br i1 %10, label %11, label %12 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; <label>:11 ; preds = %8 45*9880d681SAndroid Build Coastguard Worker store i32 1, i32* %1 46*9880d681SAndroid Build Coastguard Worker br label %14 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker; <label>:12 ; preds = %8 49*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %1 50*9880d681SAndroid Build Coastguard Worker br label %14 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; <label>:13 ; preds = %5 53*9880d681SAndroid Build Coastguard Worker br label %14 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker; <label>:14 ; preds = %4, %11, %12, %13 56*9880d681SAndroid Build Coastguard Worker %15 = load i32, i32* %1 57*9880d681SAndroid Build Coastguard Worker ret void 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workerdefine void @true_() nounwind uwtable ssp { 61*9880d681SAndroid Build Coastguard Worker; CHECK: @true_ 62*9880d681SAndroid Build Coastguard Worker; CHECK: b LBB2_1 63*9880d681SAndroid Build Coastguard Worker br i1 true, label %1, label %2 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker; <label>:1 66*9880d681SAndroid Build Coastguard Worker; CHECK: LBB2_1 67*9880d681SAndroid Build Coastguard Worker br label %2 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker; <label>:2 70*9880d681SAndroid Build Coastguard Worker ret void 71*9880d681SAndroid Build Coastguard Worker} 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Workerdefine void @false_() nounwind uwtable ssp { 74*9880d681SAndroid Build Coastguard Worker; CHECK: @false_ 75*9880d681SAndroid Build Coastguard Worker; CHECK: b LBB3_2 76*9880d681SAndroid Build Coastguard Worker br i1 false, label %1, label %2 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker; <label>:1 79*9880d681SAndroid Build Coastguard Worker br label %2 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker; <label>:2 82*9880d681SAndroid Build Coastguard Worker; CHECK: LBB3_2 83*9880d681SAndroid Build Coastguard Worker ret void 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @trunc_(i8 zeroext %a, i16 zeroext %b, i32 %c, i64 %d) { 87*9880d681SAndroid Build Coastguard Workerentry: 88*9880d681SAndroid Build Coastguard Worker %a.addr = alloca i8, align 1 89*9880d681SAndroid Build Coastguard Worker %b.addr = alloca i16, align 2 90*9880d681SAndroid Build Coastguard Worker %c.addr = alloca i32, align 4 91*9880d681SAndroid Build Coastguard Worker %d.addr = alloca i64, align 8 92*9880d681SAndroid Build Coastguard Worker store i8 %a, i8* %a.addr, align 1 93*9880d681SAndroid Build Coastguard Worker store i16 %b, i16* %b.addr, align 2 94*9880d681SAndroid Build Coastguard Worker store i32 %c, i32* %c.addr, align 4 95*9880d681SAndroid Build Coastguard Worker store i64 %d, i64* %d.addr, align 8 96*9880d681SAndroid Build Coastguard Worker %0 = load i16, i16* %b.addr, align 2 97*9880d681SAndroid Build Coastguard Worker; CHECK: tbz w0, #0, LBB4_2 98*9880d681SAndroid Build Coastguard Worker %conv = trunc i16 %0 to i1 99*9880d681SAndroid Build Coastguard Worker br i1 %conv, label %if.then, label %if.end 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 102*9880d681SAndroid Build Coastguard Worker call void @foo1() 103*9880d681SAndroid Build Coastguard Worker br label %if.end 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.then, %entry 106*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* %c.addr, align 4 107*9880d681SAndroid Build Coastguard Worker; CHECK: tbz w{{[0-9]+}}, #0, LBB4_4 108*9880d681SAndroid Build Coastguard Worker %conv1 = trunc i32 %1 to i1 109*9880d681SAndroid Build Coastguard Worker br i1 %conv1, label %if.then3, label %if.end4 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workerif.then3: ; preds = %if.end 112*9880d681SAndroid Build Coastguard Worker call void @foo1() 113*9880d681SAndroid Build Coastguard Worker br label %if.end4 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workerif.end4: ; preds = %if.then3, %if.end 116*9880d681SAndroid Build Coastguard Worker %2 = load i64, i64* %d.addr, align 8 117*9880d681SAndroid Build Coastguard Worker; CHECK: tbz w{{[0-9]+}}, #0, LBB4_6 118*9880d681SAndroid Build Coastguard Worker %conv5 = trunc i64 %2 to i1 119*9880d681SAndroid Build Coastguard Worker br i1 %conv5, label %if.then7, label %if.end8 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Workerif.then7: ; preds = %if.end4 122*9880d681SAndroid Build Coastguard Worker call void @foo1() 123*9880d681SAndroid Build Coastguard Worker br label %if.end8 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerif.end8: ; preds = %if.then7, %if.end4 126*9880d681SAndroid Build Coastguard Worker %3 = load i8, i8* %a.addr, align 1 127*9880d681SAndroid Build Coastguard Worker ret i8 %3 128*9880d681SAndroid Build Coastguard Worker} 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Workerdeclare void @foo1() 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker; rdar://15174028 133*9880d681SAndroid Build Coastguard Workerdefine i32 @trunc64(i64 %foo) nounwind { 134*9880d681SAndroid Build Coastguard Worker; CHECK: trunc64 135*9880d681SAndroid Build Coastguard Worker; CHECK: and [[REG1:x[0-9]+]], x0, #0x1 136*9880d681SAndroid Build Coastguard Worker; CHECK: mov x[[REG2:[0-9]+]], [[REG1]] 137*9880d681SAndroid Build Coastguard Worker; CHECK: tbz w[[REG2]], #0, LBB5_2 138*9880d681SAndroid Build Coastguard Worker %a = and i64 %foo, 1 139*9880d681SAndroid Build Coastguard Worker %b = trunc i64 %a to i1 140*9880d681SAndroid Build Coastguard Worker br i1 %b, label %if.then, label %if.else 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Workerif.then: 143*9880d681SAndroid Build Coastguard Worker ret i32 1 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerif.else: 146*9880d681SAndroid Build Coastguard Worker ret i32 0 147*9880d681SAndroid Build Coastguard Worker} 148