1*9880d681SAndroid Build Coastguard Worker; RUN: opt -analyze -scalar-evolution < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 4*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-unknown-linux-gnu" 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine void @f_sadd_0(i8* %a) { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f_sadd_0 8*9880d681SAndroid Build Coastguard Workerentry: 9*9880d681SAndroid Build Coastguard Worker br label %for.body 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup: ; preds = %cont 12*9880d681SAndroid Build Coastguard Worker ret void 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %cont 15*9880d681SAndroid Build Coastguard Worker; CHECK: %i.04 = phi i32 [ 0, %entry ], [ %tmp2, %cont ] 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,16) S: [0,16) 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker %i.04 = phi i32 [ 0, %entry ], [ %tmp2, %cont ] 19*9880d681SAndroid Build Coastguard Worker %idxprom = sext i32 %i.04 to i64 20*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i8, i8* %a, i64 %idxprom 21*9880d681SAndroid Build Coastguard Worker store i8 0, i8* %arrayidx, align 1 22*9880d681SAndroid Build Coastguard Worker %tmp0 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %i.04, i32 1) 23*9880d681SAndroid Build Coastguard Worker %tmp1 = extractvalue { i32, i1 } %tmp0, 1 24*9880d681SAndroid Build Coastguard Worker br i1 %tmp1, label %trap, label %cont, !nosanitize !{} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workertrap: ; preds = %for.body 27*9880d681SAndroid Build Coastguard Worker tail call void @llvm.trap() #2, !nosanitize !{} 28*9880d681SAndroid Build Coastguard Worker unreachable, !nosanitize !{} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workercont: ; preds = %for.body 31*9880d681SAndroid Build Coastguard Worker %tmp2 = extractvalue { i32, i1 } %tmp0, 0 32*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %tmp2, 16 33*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.cond.cleanup 34*9880d681SAndroid Build Coastguard Worker; CHECK: Loop %for.body: max backedge-taken count is 15 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdefine void @f_sadd_1(i8* %a) { 38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f_sadd_1 39*9880d681SAndroid Build Coastguard Workerentry: 40*9880d681SAndroid Build Coastguard Worker br label %for.body 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup: ; preds = %cont 43*9880d681SAndroid Build Coastguard Worker ret void 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %cont 46*9880d681SAndroid Build Coastguard Worker; CHECK: %i.04 = phi i32 [ 0, %entry ], [ %tmp2, %cont ] 47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> {0,+,1}<%for.body> U: [0,16) S: [0,16) 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker; SCEV can prove <nsw> for the above induction variable; but it does 50*9880d681SAndroid Build Coastguard Worker; not bother so before it sees the sext below since it is not a 100% 51*9880d681SAndroid Build Coastguard Worker; obvious. 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker %i.04 = phi i32 [ 0, %entry ], [ %tmp2, %cont ] 54*9880d681SAndroid Build Coastguard Worker %idxprom = sext i32 %i.04 to i64 55*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i8, i8* %a, i64 %idxprom 56*9880d681SAndroid Build Coastguard Worker store i8 0, i8* %arrayidx, align 1 57*9880d681SAndroid Build Coastguard Worker %tmp0 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %i.04, i32 1) 58*9880d681SAndroid Build Coastguard Worker %tmp1 = extractvalue { i32, i1 } %tmp0, 1 59*9880d681SAndroid Build Coastguard Worker br i1 %tmp1, label %trap, label %cont, !nosanitize !{} 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Workertrap: ; preds = %for.body 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker br label %cont 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workercont: ; preds = %for.body 66*9880d681SAndroid Build Coastguard Worker %tmp2 = extractvalue { i32, i1 } %tmp0, 0 67*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %tmp2, 16 68*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.cond.cleanup 69*9880d681SAndroid Build Coastguard Worker; CHECK: Loop %for.body: max backedge-taken count is 15 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdefine void @f_sadd_2(i8* %a, i1* %c) { 73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f_sadd_2 74*9880d681SAndroid Build Coastguard Workerentry: 75*9880d681SAndroid Build Coastguard Worker br label %for.body 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup: ; preds = %cont 78*9880d681SAndroid Build Coastguard Worker ret void 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %cont 81*9880d681SAndroid Build Coastguard Worker; CHECK: %i.04 = phi i32 [ 0, %entry ], [ %tmp2, %cont ] 82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> {0,+,1}<%for.body> 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker %i.04 = phi i32 [ 0, %entry ], [ %tmp2, %cont ] 85*9880d681SAndroid Build Coastguard Worker %idxprom = sext i32 %i.04 to i64 86*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i8, i8* %a, i64 %idxprom 87*9880d681SAndroid Build Coastguard Worker store i8 0, i8* %arrayidx, align 1 88*9880d681SAndroid Build Coastguard Worker %tmp0 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %i.04, i32 1) 89*9880d681SAndroid Build Coastguard Worker %tmp1 = extractvalue { i32, i1 } %tmp0, 1 90*9880d681SAndroid Build Coastguard Worker br i1 %tmp1, label %trap, label %cont, !nosanitize !{} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workertrap: ; preds = %for.body 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker br label %cont 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Workercont: ; preds = %for.body 97*9880d681SAndroid Build Coastguard Worker %tmp2 = extractvalue { i32, i1 } %tmp0, 0 98*9880d681SAndroid Build Coastguard Worker %cond = load volatile i1, i1* %c 99*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %for.body, label %for.cond.cleanup 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Workerdefine void @f_sadd_3(i8* %a, i1* %c) { 103*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f_sadd_3 104*9880d681SAndroid Build Coastguard Workerentry: 105*9880d681SAndroid Build Coastguard Worker br label %for.body 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup: ; preds = %cont 108*9880d681SAndroid Build Coastguard Worker ret void 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %cont 111*9880d681SAndroid Build Coastguard Worker; CHECK: %i.04 = phi i32 [ 0, %entry ], [ %tmp2, %for.body ] 112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker %i.04 = phi i32 [ 0, %entry ], [ %tmp2, %for.body ] 115*9880d681SAndroid Build Coastguard Worker %idxprom = sext i32 %i.04 to i64 116*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i8, i8* %a, i64 %idxprom 117*9880d681SAndroid Build Coastguard Worker store i8 0, i8* %arrayidx, align 1 118*9880d681SAndroid Build Coastguard Worker %tmp0 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %i.04, i32 1) 119*9880d681SAndroid Build Coastguard Worker %tmp1 = extractvalue { i32, i1 } %tmp0, 1 120*9880d681SAndroid Build Coastguard Worker %tmp2 = extractvalue { i32, i1 } %tmp0, 0 121*9880d681SAndroid Build Coastguard Worker br i1 %tmp1, label %trap, label %for.body, !nosanitize !{} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workertrap: ; preds = %for.body 124*9880d681SAndroid Build Coastguard Worker tail call void @llvm.trap() #2, !nosanitize !{} 125*9880d681SAndroid Build Coastguard Worker unreachable, !nosanitize !{} 126*9880d681SAndroid Build Coastguard Worker} 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Workerdefine void @f_sadd_4(i8* %a, i1* %c) { 129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f_sadd_4 130*9880d681SAndroid Build Coastguard Workerentry: 131*9880d681SAndroid Build Coastguard Worker br label %for.body 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup: ; preds = %cont 134*9880d681SAndroid Build Coastguard Worker ret void 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %cont 137*9880d681SAndroid Build Coastguard Worker; CHECK: %i.04 = phi i32 [ 0, %entry ], [ %tmp2, %merge ] 138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker %i.04 = phi i32 [ 0, %entry ], [ %tmp2, %merge ] 141*9880d681SAndroid Build Coastguard Worker %idxprom = sext i32 %i.04 to i64 142*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i8, i8* %a, i64 %idxprom 143*9880d681SAndroid Build Coastguard Worker store i8 0, i8* %arrayidx, align 1 144*9880d681SAndroid Build Coastguard Worker %tmp0 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %i.04, i32 1) 145*9880d681SAndroid Build Coastguard Worker %tmp1 = extractvalue { i32, i1 } %tmp0, 1 146*9880d681SAndroid Build Coastguard Worker %tmp2 = extractvalue { i32, i1 } %tmp0, 0 147*9880d681SAndroid Build Coastguard Worker br i1 %tmp1, label %notrap, label %merge 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Workernotrap: 150*9880d681SAndroid Build Coastguard Worker br label %merge 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workermerge: 153*9880d681SAndroid Build Coastguard Worker %tmp3 = extractvalue { i32, i1 } %tmp0, 1 154*9880d681SAndroid Build Coastguard Worker br i1 %tmp3, label %trap, label %for.body, !nosanitize !{} 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Workertrap: ; preds = %for.body 157*9880d681SAndroid Build Coastguard Worker tail call void @llvm.trap() #2, !nosanitize !{} 158*9880d681SAndroid Build Coastguard Worker unreachable, !nosanitize !{} 159*9880d681SAndroid Build Coastguard Worker} 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Workerdefine void @f_sadd_may_overflow(i8* %a, i1* %c) { 162*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f_sadd_may_overflow 163*9880d681SAndroid Build Coastguard Workerentry: 164*9880d681SAndroid Build Coastguard Worker br label %for.body 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup: ; preds = %cont 167*9880d681SAndroid Build Coastguard Worker ret void 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %cont 170*9880d681SAndroid Build Coastguard Worker; CHECK: %i.04 = phi i32 [ 0, %entry ], [ %tmp1, %cont ] 171*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> {0,+,1}<%for.body> U: full-set S: full-set 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker %i.04 = phi i32 [ 0, %entry ], [ %tmp1, %cont ] 174*9880d681SAndroid Build Coastguard Worker %idxprom = sext i32 %i.04 to i64 175*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i8, i8* %a, i64 %idxprom 176*9880d681SAndroid Build Coastguard Worker store i8 0, i8* %arrayidx, align 1 177*9880d681SAndroid Build Coastguard Worker %tmp0 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %i.04, i32 1) 178*9880d681SAndroid Build Coastguard Worker %cond1 = load volatile i1, i1* %c 179*9880d681SAndroid Build Coastguard Worker br i1 %cond1, label %trap, label %cont, !nosanitize !{} 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Workertrap: ; preds = %for.body 182*9880d681SAndroid Build Coastguard Worker tail call void @llvm.trap() #2, !nosanitize !{} 183*9880d681SAndroid Build Coastguard Worker unreachable, !nosanitize !{} 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Workercont: ; preds = %for.body 186*9880d681SAndroid Build Coastguard Worker %tmp1 = extractvalue { i32, i1 } %tmp0, 0 187*9880d681SAndroid Build Coastguard Worker %cond = load volatile i1, i1* %c 188*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %for.body, label %for.cond.cleanup 189*9880d681SAndroid Build Coastguard Worker} 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Workerdefine void @f_uadd(i8* %a) { 192*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f_uadd 193*9880d681SAndroid Build Coastguard Workerentry: 194*9880d681SAndroid Build Coastguard Worker br label %for.body 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup: ; preds = %cont 197*9880d681SAndroid Build Coastguard Worker ret void 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %cont 200*9880d681SAndroid Build Coastguard Worker; CHECK: %i.04 = phi i32 [ 0, %entry ], [ %tmp2, %cont ] 201*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> {0,+,1}<nuw><%for.body> U: [0,16) S: [0,16) 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Worker %i.04 = phi i32 [ 0, %entry ], [ %tmp2, %cont ] 204*9880d681SAndroid Build Coastguard Worker %idxprom = sext i32 %i.04 to i64 205*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i8, i8* %a, i64 %idxprom 206*9880d681SAndroid Build Coastguard Worker store i8 0, i8* %arrayidx, align 1 207*9880d681SAndroid Build Coastguard Worker %tmp0 = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %i.04, i32 1) 208*9880d681SAndroid Build Coastguard Worker %tmp1 = extractvalue { i32, i1 } %tmp0, 1 209*9880d681SAndroid Build Coastguard Worker br i1 %tmp1, label %trap, label %cont, !nosanitize !{} 210*9880d681SAndroid Build Coastguard Worker 211*9880d681SAndroid Build Coastguard Workertrap: ; preds = %for.body 212*9880d681SAndroid Build Coastguard Worker tail call void @llvm.trap(), !nosanitize !{} 213*9880d681SAndroid Build Coastguard Worker unreachable, !nosanitize !{} 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard Workercont: ; preds = %for.body 216*9880d681SAndroid Build Coastguard Worker %tmp2 = extractvalue { i32, i1 } %tmp0, 0 217*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %tmp2, 16 218*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.cond.cleanup 219*9880d681SAndroid Build Coastguard Worker; CHECK: Loop %for.body: max backedge-taken count is 15 220*9880d681SAndroid Build Coastguard Worker} 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Workerdefine void @f_ssub(i8* nocapture %a) { 223*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f_ssub 224*9880d681SAndroid Build Coastguard Workerentry: 225*9880d681SAndroid Build Coastguard Worker br label %for.body 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup: ; preds = %cont 228*9880d681SAndroid Build Coastguard Worker ret void 229*9880d681SAndroid Build Coastguard Worker 230*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %cont 231*9880d681SAndroid Build Coastguard Worker; CHECK: %i.04 = phi i32 [ 15, %entry ], [ %tmp2, %cont ] 232*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> {15,+,-1}<%for.body> U: [0,16) S: [0,16) 233*9880d681SAndroid Build Coastguard Worker 234*9880d681SAndroid Build Coastguard Worker %i.04 = phi i32 [ 15, %entry ], [ %tmp2, %cont ] 235*9880d681SAndroid Build Coastguard Worker %idxprom = sext i32 %i.04 to i64 236*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i8, i8* %a, i64 %idxprom 237*9880d681SAndroid Build Coastguard Worker store i8 0, i8* %arrayidx, align 1 238*9880d681SAndroid Build Coastguard Worker %tmp0 = tail call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %i.04, i32 1) 239*9880d681SAndroid Build Coastguard Worker %tmp1 = extractvalue { i32, i1 } %tmp0, 1 240*9880d681SAndroid Build Coastguard Worker br i1 %tmp1, label %trap, label %cont, !nosanitize !{} 241*9880d681SAndroid Build Coastguard Worker 242*9880d681SAndroid Build Coastguard Workertrap: ; preds = %for.body 243*9880d681SAndroid Build Coastguard Worker tail call void @llvm.trap(), !nosanitize !{} 244*9880d681SAndroid Build Coastguard Worker unreachable, !nosanitize !{} 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Workercont: ; preds = %for.body 247*9880d681SAndroid Build Coastguard Worker %tmp2 = extractvalue { i32, i1 } %tmp0, 0 248*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %tmp2, -1 249*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.cond.cleanup 250*9880d681SAndroid Build Coastguard Worker; CHECK: Loop %for.body: max backedge-taken count is 15 251*9880d681SAndroid Build Coastguard Worker} 252*9880d681SAndroid Build Coastguard Worker 253*9880d681SAndroid Build Coastguard Workerdefine void @f_usub(i8* nocapture %a) { 254*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f_usub 255*9880d681SAndroid Build Coastguard Workerentry: 256*9880d681SAndroid Build Coastguard Worker br label %for.body 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup: ; preds = %cont 259*9880d681SAndroid Build Coastguard Worker ret void 260*9880d681SAndroid Build Coastguard Worker 261*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %cont 262*9880d681SAndroid Build Coastguard Worker; CHECK: %i.04 = phi i32 [ 15, %entry ], [ %tmp2, %cont ] 263*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> {15,+,-1}<%for.body> U: [0,16) S: [0,16) 264*9880d681SAndroid Build Coastguard Worker 265*9880d681SAndroid Build Coastguard Worker %i.04 = phi i32 [ 15, %entry ], [ %tmp2, %cont ] 266*9880d681SAndroid Build Coastguard Worker %idxprom = sext i32 %i.04 to i64 267*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i8, i8* %a, i64 %idxprom 268*9880d681SAndroid Build Coastguard Worker store i8 0, i8* %arrayidx, align 1 269*9880d681SAndroid Build Coastguard Worker %tmp0 = tail call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %i.04, i32 1) 270*9880d681SAndroid Build Coastguard Worker %tmp1 = extractvalue { i32, i1 } %tmp0, 1 271*9880d681SAndroid Build Coastguard Worker br i1 %tmp1, label %trap, label %cont, !nosanitize !{} 272*9880d681SAndroid Build Coastguard Worker 273*9880d681SAndroid Build Coastguard Workertrap: ; preds = %for.body 274*9880d681SAndroid Build Coastguard Worker tail call void @llvm.trap(), !nosanitize !{} 275*9880d681SAndroid Build Coastguard Worker unreachable, !nosanitize !{} 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Workercont: ; preds = %for.body 278*9880d681SAndroid Build Coastguard Worker %tmp2 = extractvalue { i32, i1 } %tmp0, 0 279*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %tmp2, -1 280*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.cond.cleanup 281*9880d681SAndroid Build Coastguard Worker; CHECK: Loop %for.body: max backedge-taken count is 15 282*9880d681SAndroid Build Coastguard Worker} 283*9880d681SAndroid Build Coastguard Worker 284*9880d681SAndroid Build Coastguard Workerdefine i32 @f_smul(i32 %val_a, i32 %val_b) { 285*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f_smul 286*9880d681SAndroid Build Coastguard Worker %agg = tail call { i32, i1 } @llvm.smul.with.overflow.i32(i32 %val_a, i32 %val_b) 287*9880d681SAndroid Build Coastguard Worker; CHECK: %mul = extractvalue { i32, i1 } %agg, 0 288*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (%val_a * %val_b) U: full-set S: full-set 289*9880d681SAndroid Build Coastguard Worker %mul = extractvalue { i32, i1 } %agg, 0 290*9880d681SAndroid Build Coastguard Worker ret i32 %mul 291*9880d681SAndroid Build Coastguard Worker} 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Workerdefine i32 @f_umul(i32 %val_a, i32 %val_b) { 294*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f_umul 295*9880d681SAndroid Build Coastguard Worker %agg = tail call { i32, i1 } @llvm.umul.with.overflow.i32(i32 %val_a, i32 %val_b) 296*9880d681SAndroid Build Coastguard Worker; CHECK: %mul = extractvalue { i32, i1 } %agg, 0 297*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (%val_a * %val_b) U: full-set S: full-set 298*9880d681SAndroid Build Coastguard Worker %mul = extractvalue { i32, i1 } %agg, 0 299*9880d681SAndroid Build Coastguard Worker ret i32 %mul 300*9880d681SAndroid Build Coastguard Worker} 301*9880d681SAndroid Build Coastguard Worker 302*9880d681SAndroid Build Coastguard Workerdeclare { i32, i1 } @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone 303*9880d681SAndroid Build Coastguard Workerdeclare { i32, i1 } @llvm.uadd.with.overflow.i32(i32, i32) nounwind readnone 304*9880d681SAndroid Build Coastguard Workerdeclare { i32, i1 } @llvm.ssub.with.overflow.i32(i32, i32) nounwind readnone 305*9880d681SAndroid Build Coastguard Workerdeclare { i32, i1 } @llvm.usub.with.overflow.i32(i32, i32) nounwind readnone 306*9880d681SAndroid Build Coastguard Workerdeclare { i32, i1 } @llvm.smul.with.overflow.i32(i32, i32) nounwind readnone 307*9880d681SAndroid Build Coastguard Workerdeclare { i32, i1 } @llvm.umul.with.overflow.i32(i32, i32) nounwind readnone 308*9880d681SAndroid Build Coastguard Worker 309*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.trap() #2 310