1*9880d681SAndroid Build Coastguard Worker; RUN: llc -O3 -mtriple arm64-apple-ios3 -aarch64-gep-opt=false %s -o - | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; <rdar://problem/13621857> 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker@block = common global i8* null, align 8 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine i32 @fct(i32 %i1, i32 %i2) { 7*9880d681SAndroid Build Coastguard Worker; CHECK: @fct 8*9880d681SAndroid Build Coastguard Worker; Sign extension is used more than once, thus it should not be folded. 9*9880d681SAndroid Build Coastguard Worker; CodeGenPrepare is not sharing sext across uses, thus this is folded because 10*9880d681SAndroid Build Coastguard Worker; of that. 11*9880d681SAndroid Build Coastguard Worker; _CHECK-NOT_: , sxtw] 12*9880d681SAndroid Build Coastguard Workerentry: 13*9880d681SAndroid Build Coastguard Worker %idxprom = sext i32 %i1 to i64 14*9880d681SAndroid Build Coastguard Worker %0 = load i8*, i8** @block, align 8 15*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i8, i8* %0, i64 %idxprom 16*9880d681SAndroid Build Coastguard Worker %1 = load i8, i8* %arrayidx, align 1 17*9880d681SAndroid Build Coastguard Worker %idxprom1 = sext i32 %i2 to i64 18*9880d681SAndroid Build Coastguard Worker %arrayidx2 = getelementptr inbounds i8, i8* %0, i64 %idxprom1 19*9880d681SAndroid Build Coastguard Worker %2 = load i8, i8* %arrayidx2, align 1 20*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %1, %2 21*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.end, label %if.then 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 24*9880d681SAndroid Build Coastguard Worker %cmp7 = icmp ugt i8 %1, %2 25*9880d681SAndroid Build Coastguard Worker %conv8 = zext i1 %cmp7 to i32 26*9880d681SAndroid Build Coastguard Worker br label %return 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %entry 29*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %i1, 1 30*9880d681SAndroid Build Coastguard Worker %inc9 = add nsw i32 %i2, 1 31*9880d681SAndroid Build Coastguard Worker %idxprom10 = sext i32 %inc to i64 32*9880d681SAndroid Build Coastguard Worker %arrayidx11 = getelementptr inbounds i8, i8* %0, i64 %idxprom10 33*9880d681SAndroid Build Coastguard Worker %3 = load i8, i8* %arrayidx11, align 1 34*9880d681SAndroid Build Coastguard Worker %idxprom12 = sext i32 %inc9 to i64 35*9880d681SAndroid Build Coastguard Worker %arrayidx13 = getelementptr inbounds i8, i8* %0, i64 %idxprom12 36*9880d681SAndroid Build Coastguard Worker %4 = load i8, i8* %arrayidx13, align 1 37*9880d681SAndroid Build Coastguard Worker %cmp16 = icmp eq i8 %3, %4 38*9880d681SAndroid Build Coastguard Worker br i1 %cmp16, label %if.end23, label %if.then18 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerif.then18: ; preds = %if.end 41*9880d681SAndroid Build Coastguard Worker %cmp21 = icmp ugt i8 %3, %4 42*9880d681SAndroid Build Coastguard Worker %conv22 = zext i1 %cmp21 to i32 43*9880d681SAndroid Build Coastguard Worker br label %return 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerif.end23: ; preds = %if.end 46*9880d681SAndroid Build Coastguard Worker %inc24 = add nsw i32 %i1, 2 47*9880d681SAndroid Build Coastguard Worker %inc25 = add nsw i32 %i2, 2 48*9880d681SAndroid Build Coastguard Worker %idxprom26 = sext i32 %inc24 to i64 49*9880d681SAndroid Build Coastguard Worker %arrayidx27 = getelementptr inbounds i8, i8* %0, i64 %idxprom26 50*9880d681SAndroid Build Coastguard Worker %5 = load i8, i8* %arrayidx27, align 1 51*9880d681SAndroid Build Coastguard Worker %idxprom28 = sext i32 %inc25 to i64 52*9880d681SAndroid Build Coastguard Worker %arrayidx29 = getelementptr inbounds i8, i8* %0, i64 %idxprom28 53*9880d681SAndroid Build Coastguard Worker %6 = load i8, i8* %arrayidx29, align 1 54*9880d681SAndroid Build Coastguard Worker %cmp32 = icmp eq i8 %5, %6 55*9880d681SAndroid Build Coastguard Worker br i1 %cmp32, label %return, label %if.then34 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerif.then34: ; preds = %if.end23 58*9880d681SAndroid Build Coastguard Worker %cmp37 = icmp ugt i8 %5, %6 59*9880d681SAndroid Build Coastguard Worker %conv38 = zext i1 %cmp37 to i32 60*9880d681SAndroid Build Coastguard Worker br label %return 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %if.end23, %if.then34, %if.then18, %if.then 63*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ %conv8, %if.then ], [ %conv22, %if.then18 ], [ %conv38, %if.then34 ], [ 1, %if.end23 ] 64*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerdefine i32 @fct1(i32 %i1, i32 %i2) optsize { 68*9880d681SAndroid Build Coastguard Worker; CHECK: @fct1 69*9880d681SAndroid Build Coastguard Worker; Addressing are folded when optimizing for code size. 70*9880d681SAndroid Build Coastguard Worker; CHECK: , sxtw] 71*9880d681SAndroid Build Coastguard Worker; CHECK: , sxtw] 72*9880d681SAndroid Build Coastguard Workerentry: 73*9880d681SAndroid Build Coastguard Worker %idxprom = sext i32 %i1 to i64 74*9880d681SAndroid Build Coastguard Worker %0 = load i8*, i8** @block, align 8 75*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i8, i8* %0, i64 %idxprom 76*9880d681SAndroid Build Coastguard Worker %1 = load i8, i8* %arrayidx, align 1 77*9880d681SAndroid Build Coastguard Worker %idxprom1 = sext i32 %i2 to i64 78*9880d681SAndroid Build Coastguard Worker %arrayidx2 = getelementptr inbounds i8, i8* %0, i64 %idxprom1 79*9880d681SAndroid Build Coastguard Worker %2 = load i8, i8* %arrayidx2, align 1 80*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i8 %1, %2 81*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.end, label %if.then 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 84*9880d681SAndroid Build Coastguard Worker %cmp7 = icmp ugt i8 %1, %2 85*9880d681SAndroid Build Coastguard Worker %conv8 = zext i1 %cmp7 to i32 86*9880d681SAndroid Build Coastguard Worker br label %return 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %entry 89*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %i1, 1 90*9880d681SAndroid Build Coastguard Worker %inc9 = add nsw i32 %i2, 1 91*9880d681SAndroid Build Coastguard Worker %idxprom10 = sext i32 %inc to i64 92*9880d681SAndroid Build Coastguard Worker %arrayidx11 = getelementptr inbounds i8, i8* %0, i64 %idxprom10 93*9880d681SAndroid Build Coastguard Worker %3 = load i8, i8* %arrayidx11, align 1 94*9880d681SAndroid Build Coastguard Worker %idxprom12 = sext i32 %inc9 to i64 95*9880d681SAndroid Build Coastguard Worker %arrayidx13 = getelementptr inbounds i8, i8* %0, i64 %idxprom12 96*9880d681SAndroid Build Coastguard Worker %4 = load i8, i8* %arrayidx13, align 1 97*9880d681SAndroid Build Coastguard Worker %cmp16 = icmp eq i8 %3, %4 98*9880d681SAndroid Build Coastguard Worker br i1 %cmp16, label %if.end23, label %if.then18 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Workerif.then18: ; preds = %if.end 101*9880d681SAndroid Build Coastguard Worker %cmp21 = icmp ugt i8 %3, %4 102*9880d681SAndroid Build Coastguard Worker %conv22 = zext i1 %cmp21 to i32 103*9880d681SAndroid Build Coastguard Worker br label %return 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerif.end23: ; preds = %if.end 106*9880d681SAndroid Build Coastguard Worker %inc24 = add nsw i32 %i1, 2 107*9880d681SAndroid Build Coastguard Worker %inc25 = add nsw i32 %i2, 2 108*9880d681SAndroid Build Coastguard Worker %idxprom26 = sext i32 %inc24 to i64 109*9880d681SAndroid Build Coastguard Worker %arrayidx27 = getelementptr inbounds i8, i8* %0, i64 %idxprom26 110*9880d681SAndroid Build Coastguard Worker %5 = load i8, i8* %arrayidx27, align 1 111*9880d681SAndroid Build Coastguard Worker %idxprom28 = sext i32 %inc25 to i64 112*9880d681SAndroid Build Coastguard Worker %arrayidx29 = getelementptr inbounds i8, i8* %0, i64 %idxprom28 113*9880d681SAndroid Build Coastguard Worker %6 = load i8, i8* %arrayidx29, align 1 114*9880d681SAndroid Build Coastguard Worker %cmp32 = icmp eq i8 %5, %6 115*9880d681SAndroid Build Coastguard Worker br i1 %cmp32, label %return, label %if.then34 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerif.then34: ; preds = %if.end23 118*9880d681SAndroid Build Coastguard Worker %cmp37 = icmp ugt i8 %5, %6 119*9880d681SAndroid Build Coastguard Worker %conv38 = zext i1 %cmp37 to i32 120*9880d681SAndroid Build Coastguard Worker br label %return 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %if.end23, %if.then34, %if.then18, %if.then 123*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ %conv8, %if.then ], [ %conv22, %if.then18 ], [ %conv38, %if.then34 ], [ 1, %if.end23 ] 124*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 125*9880d681SAndroid Build Coastguard Worker} 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker; CHECK: @test 128*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: , uxtw #2] 129*9880d681SAndroid Build Coastguard Workerdefine i32 @test(i32* %array, i8 zeroext %c, i32 %arg) { 130*9880d681SAndroid Build Coastguard Workerentry: 131*9880d681SAndroid Build Coastguard Worker %conv = zext i8 %c to i32 132*9880d681SAndroid Build Coastguard Worker %add = sub i32 0, %arg 133*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %conv, %add 134*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.end, label %if.then 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 137*9880d681SAndroid Build Coastguard Worker %idxprom = zext i8 %c to i64 138*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %array, i64 %idxprom 139*9880d681SAndroid Build Coastguard Worker %0 = load volatile i32, i32* %arrayidx, align 4 140*9880d681SAndroid Build Coastguard Worker %1 = load volatile i32, i32* %arrayidx, align 4 141*9880d681SAndroid Build Coastguard Worker %add3 = add nsw i32 %1, %0 142*9880d681SAndroid Build Coastguard Worker br label %if.end 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %entry, %if.then 145*9880d681SAndroid Build Coastguard Worker %res.0 = phi i32 [ %add3, %if.then ], [ 0, %entry ] 146*9880d681SAndroid Build Coastguard Worker ret i32 %res.0 147*9880d681SAndroid Build Coastguard Worker} 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker; CHECK: @test2 151*9880d681SAndroid Build Coastguard Worker; CHECK: , uxtw #2] 152*9880d681SAndroid Build Coastguard Worker; CHECK: , uxtw #2] 153*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32* %array, i8 zeroext %c, i32 %arg) optsize { 154*9880d681SAndroid Build Coastguard Workerentry: 155*9880d681SAndroid Build Coastguard Worker %conv = zext i8 %c to i32 156*9880d681SAndroid Build Coastguard Worker %add = sub i32 0, %arg 157*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %conv, %add 158*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.end, label %if.then 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 161*9880d681SAndroid Build Coastguard Worker %idxprom = zext i8 %c to i64 162*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %array, i64 %idxprom 163*9880d681SAndroid Build Coastguard Worker %0 = load volatile i32, i32* %arrayidx, align 4 164*9880d681SAndroid Build Coastguard Worker %1 = load volatile i32, i32* %arrayidx, align 4 165*9880d681SAndroid Build Coastguard Worker %add3 = add nsw i32 %1, %0 166*9880d681SAndroid Build Coastguard Worker br label %if.end 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %entry, %if.then 169*9880d681SAndroid Build Coastguard Worker %res.0 = phi i32 [ %add3, %if.then ], [ 0, %entry ] 170*9880d681SAndroid Build Coastguard Worker ret i32 %res.0 171*9880d681SAndroid Build Coastguard Worker} 172