1; RUN: opt < %s -analyze -enable-new-pm=0 -scalar-evolution | FileCheck %s 2; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck %s 3 4declare { i16, i1 } @llvm.sadd.with.overflow.i16(i16, i16) nounwind readnone 5declare { i16, i1 } @llvm.uadd.with.overflow.i16(i16, i16) nounwind readnone 6declare { i16, i1 } @llvm.ssub.with.overflow.i16(i16, i16) nounwind readnone 7declare { i16, i1 } @llvm.usub.with.overflow.i16(i16, i16) nounwind readnone 8declare { i16, i1 } @llvm.smul.with.overflow.i16(i16, i16) nounwind readnone 9declare { i16, i1 } @llvm.umul.with.overflow.i16(i16, i16) nounwind readnone 10 11; CHECK-LABEL: Classifying expressions for: @uadd_exhaustive 12; CHECK: Loop %for.body: backedge-taken count is 35 13define void @uadd_exhaustive() { 14entry: 15 br i1 undef, label %for.end, label %for.body.preheader 16 17for.body.preheader: ; preds = %entry 18 br label %for.body 19 20for.body: ; preds = %for.body.preheader, %for.body 21 %indvars.iv = phi i16 [ %math, %for.body ], [ 65500, %for.body.preheader ] 22 %0 = call { i16, i1 } @llvm.uadd.with.overflow.i16(i16 %indvars.iv, i16 1) 23 %math = extractvalue { i16, i1 } %0, 0 24 %ov = extractvalue { i16, i1 } %0, 1 25 br i1 %ov, label %for.end, label %for.body 26 27for.end: ; preds = %for.body, %entry 28 ret void 29} 30 31; CHECK-LABEL: Classifying expressions for: @sadd_exhaustive 32; CHECK: Loop %for.body: backedge-taken count is 67 33define void @sadd_exhaustive() { 34entry: 35 br i1 undef, label %for.end, label %for.body.preheader 36 37for.body.preheader: ; preds = %entry 38 br label %for.body 39 40for.body: ; preds = %for.body.preheader, %for.body 41 %indvars.iv = phi i16 [ %math, %for.body ], [ 32700, %for.body.preheader ] 42 %0 = call { i16, i1 } @llvm.sadd.with.overflow.i16(i16 %indvars.iv, i16 1) 43 %math = extractvalue { i16, i1 } %0, 0 44 %ov = extractvalue { i16, i1 } %0, 1 45 br i1 %ov, label %for.end, label %for.body 46 47for.end: ; preds = %for.body, %entry 48 ret void 49} 50 51; CHECK-LABEL: Classifying expressions for: @usub_exhaustive 52; CHECK: Loop %for.body: backedge-taken count is 50 53define void @usub_exhaustive() { 54entry: 55 br i1 undef, label %for.end, label %for.body.preheader 56 57for.body.preheader: ; preds = %entry 58 br label %for.body 59 60for.body: ; preds = %for.body.preheader, %for.body 61 %indvars.iv = phi i16 [ %math, %for.body ], [ 50, %for.body.preheader ] 62 %0 = call { i16, i1 } @llvm.usub.with.overflow.i16(i16 %indvars.iv, i16 1) 63 %math = extractvalue { i16, i1 } %0, 0 64 %ov = extractvalue { i16, i1 } %0, 1 65 br i1 %ov, label %for.end, label %for.body 66 67for.end: ; preds = %for.body, %entry 68 ret void 69} 70 71; CHECK-LABEL: Classifying expressions for: @ssub_exhaustive 72; CHECK: Loop %for.body: backedge-taken count is 68 73define void @ssub_exhaustive() { 74entry: 75 br i1 undef, label %for.end, label %for.body.preheader 76 77for.body.preheader: ; preds = %entry 78 br label %for.body 79 80for.body: ; preds = %for.body.preheader, %for.body 81 %indvars.iv = phi i16 [ %math, %for.body ], [ -32700, %for.body.preheader ] 82 %0 = call { i16, i1 } @llvm.ssub.with.overflow.i16(i16 %indvars.iv, i16 1) 83 %math = extractvalue { i16, i1 } %0, 0 84 %ov = extractvalue { i16, i1 } %0, 1 85 br i1 %ov, label %for.end, label %for.body 86 87for.end: ; preds = %for.body, %entry 88 ret void 89} 90 91; CHECK-LABEL: Classifying expressions for: @smul_exhaustive 92; CHECK: Loop %for.body: backedge-taken count is 14 93define void @smul_exhaustive() { 94entry: 95 br i1 undef, label %for.end, label %for.body.preheader 96 97for.body.preheader: ; preds = %entry 98 br label %for.body 99 100for.body: ; preds = %for.body.preheader, %for.body 101 %indvars.iv = phi i16 [ %math, %for.body ], [ 1, %for.body.preheader ] 102 %0 = call { i16, i1 } @llvm.smul.with.overflow.i16(i16 %indvars.iv, i16 2) 103 %math = extractvalue { i16, i1 } %0, 0 104 %ov = extractvalue { i16, i1 } %0, 1 105 br i1 %ov, label %for.end, label %for.body 106 107for.end: ; preds = %for.body, %entry 108 ret void 109} 110 111; CHECK-LABEL: Classifying expressions for: @umul_exhaustive 112; CHECK: Loop %for.body: backedge-taken count is 15 113define void @umul_exhaustive() { 114entry: 115 br i1 undef, label %for.end, label %for.body.preheader 116 117for.body.preheader: ; preds = %entry 118 br label %for.body 119 120for.body: ; preds = %for.body.preheader, %for.body 121 %indvars.iv = phi i16 [ %math, %for.body ], [ 1, %for.body.preheader ] 122 %0 = call { i16, i1 } @llvm.umul.with.overflow.i16(i16 %indvars.iv, i16 2) 123 %math = extractvalue { i16, i1 } %0, 0 124 %ov = extractvalue { i16, i1 } %0, 1 125 br i1 %ov, label %for.end, label %for.body 126 127for.end: ; preds = %for.body, %entry 128 ret void 129} 130