390 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py2; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-classify-expressions=0 2>&1 | FileCheck %s3 4declare { i16, i1 } @llvm.sadd.with.overflow.i16(i16, i16) nounwind readnone5declare { i16, i1 } @llvm.uadd.with.overflow.i16(i16, i16) nounwind readnone6declare { i16, i1 } @llvm.ssub.with.overflow.i16(i16, i16) nounwind readnone7declare { i16, i1 } @llvm.usub.with.overflow.i16(i16, i16) nounwind readnone8declare { i16, i1 } @llvm.smul.with.overflow.i16(i16, i16) nounwind readnone9declare { i16, i1 } @llvm.umul.with.overflow.i16(i16, i16) nounwind readnone10 11define void @uadd_exhaustive(i1 %arg) {12; CHECK-LABEL: 'uadd_exhaustive'13; CHECK-NEXT: Determining loop execution counts for: @uadd_exhaustive14; CHECK-NEXT: Loop %for.body: backedge-taken count is i16 3515; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i16 3516; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i16 3517; CHECK-NEXT: Loop %for.body: Trip multiple is 3618;19entry:20 br i1 %arg, label %for.end, label %for.body.preheader21 22for.body.preheader: ; preds = %entry23 br label %for.body24 25for.body: ; preds = %for.body.preheader, %for.body26 %indvars.iv = phi i16 [ %math, %for.body ], [ 65500, %for.body.preheader ]27 %0 = call { i16, i1 } @llvm.uadd.with.overflow.i16(i16 %indvars.iv, i16 1)28 %math = extractvalue { i16, i1 } %0, 029 %ov = extractvalue { i16, i1 } %0, 130 br i1 %ov, label %for.end, label %for.body31 32for.end: ; preds = %for.body, %entry33 ret void34}35 36define void @sadd_exhaustive(i1 %arg) {37; CHECK-LABEL: 'sadd_exhaustive'38; CHECK-NEXT: Determining loop execution counts for: @sadd_exhaustive39; CHECK-NEXT: Loop %for.body: backedge-taken count is i16 6740; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i16 6741; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i16 6742; CHECK-NEXT: Loop %for.body: Trip multiple is 6843;44entry:45 br i1 %arg, label %for.end, label %for.body.preheader46 47for.body.preheader: ; preds = %entry48 br label %for.body49 50for.body: ; preds = %for.body.preheader, %for.body51 %indvars.iv = phi i16 [ %math, %for.body ], [ 32700, %for.body.preheader ]52 %0 = call { i16, i1 } @llvm.sadd.with.overflow.i16(i16 %indvars.iv, i16 1)53 %math = extractvalue { i16, i1 } %0, 054 %ov = extractvalue { i16, i1 } %0, 155 br i1 %ov, label %for.end, label %for.body56 57for.end: ; preds = %for.body, %entry58 ret void59}60 61define void @usub_exhaustive(i1 %arg) {62; CHECK-LABEL: 'usub_exhaustive'63; CHECK-NEXT: Determining loop execution counts for: @usub_exhaustive64; CHECK-NEXT: Loop %for.body: backedge-taken count is i16 5065; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i16 5066; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i16 5067; CHECK-NEXT: Loop %for.body: Trip multiple is 5168;69entry:70 br i1 %arg, label %for.end, label %for.body.preheader71 72for.body.preheader: ; preds = %entry73 br label %for.body74 75for.body: ; preds = %for.body.preheader, %for.body76 %indvars.iv = phi i16 [ %math, %for.body ], [ 50, %for.body.preheader ]77 %0 = call { i16, i1 } @llvm.usub.with.overflow.i16(i16 %indvars.iv, i16 1)78 %math = extractvalue { i16, i1 } %0, 079 %ov = extractvalue { i16, i1 } %0, 180 br i1 %ov, label %for.end, label %for.body81 82for.end: ; preds = %for.body, %entry83 ret void84}85 86define void @ssub_exhaustive(i1 %arg) {87; CHECK-LABEL: 'ssub_exhaustive'88; CHECK-NEXT: Determining loop execution counts for: @ssub_exhaustive89; CHECK-NEXT: Loop %for.body: backedge-taken count is i16 6890; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i16 6891; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i16 6892; CHECK-NEXT: Loop %for.body: Trip multiple is 6993;94entry:95 br i1 %arg, label %for.end, label %for.body.preheader96 97for.body.preheader: ; preds = %entry98 br label %for.body99 100for.body: ; preds = %for.body.preheader, %for.body101 %indvars.iv = phi i16 [ %math, %for.body ], [ -32700, %for.body.preheader ]102 %0 = call { i16, i1 } @llvm.ssub.with.overflow.i16(i16 %indvars.iv, i16 1)103 %math = extractvalue { i16, i1 } %0, 0104 %ov = extractvalue { i16, i1 } %0, 1105 br i1 %ov, label %for.end, label %for.body106 107for.end: ; preds = %for.body, %entry108 ret void109}110 111define void @smul_exhaustive(i1 %arg) {112; CHECK-LABEL: 'smul_exhaustive'113; CHECK-NEXT: Determining loop execution counts for: @smul_exhaustive114; CHECK-NEXT: Loop %for.body: backedge-taken count is i32 14115; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 14116; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i32 14117; CHECK-NEXT: Loop %for.body: Trip multiple is 15118;119entry:120 br i1 %arg, label %for.end, label %for.body.preheader121 122for.body.preheader: ; preds = %entry123 br label %for.body124 125for.body: ; preds = %for.body.preheader, %for.body126 %indvars.iv = phi i16 [ %math, %for.body ], [ 1, %for.body.preheader ]127 %0 = call { i16, i1 } @llvm.smul.with.overflow.i16(i16 %indvars.iv, i16 2)128 %math = extractvalue { i16, i1 } %0, 0129 %ov = extractvalue { i16, i1 } %0, 1130 br i1 %ov, label %for.end, label %for.body131 132for.end: ; preds = %for.body, %entry133 ret void134}135 136define void @umul_exhaustive(i1 %arg) {137; CHECK-LABEL: 'umul_exhaustive'138; CHECK-NEXT: Determining loop execution counts for: @umul_exhaustive139; CHECK-NEXT: Loop %for.body: backedge-taken count is i32 15140; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 15141; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i32 15142; CHECK-NEXT: Loop %for.body: Trip multiple is 16143;144entry:145 br i1 %arg, label %for.end, label %for.body.preheader146 147for.body.preheader: ; preds = %entry148 br label %for.body149 150for.body: ; preds = %for.body.preheader, %for.body151 %indvars.iv = phi i16 [ %math, %for.body ], [ 1, %for.body.preheader ]152 %0 = call { i16, i1 } @llvm.umul.with.overflow.i16(i16 %indvars.iv, i16 2)153 %math = extractvalue { i16, i1 } %0, 0154 %ov = extractvalue { i16, i1 } %0, 1155 br i1 %ov, label %for.end, label %for.body156 157for.end: ; preds = %for.body, %entry158 ret void159}160 161define void @uadd_symbolic_start(i16 %start, i1 %arg) {162; CHECK-LABEL: 'uadd_symbolic_start'163; CHECK-NEXT: Determining loop execution counts for: @uadd_symbolic_start164; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + (-1 * %start))165; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i16 -1166; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + (-1 * %start))167; CHECK-NEXT: Loop %for.body: Trip multiple is 1168;169entry:170 br i1 %arg, label %for.end, label %for.body.preheader171 172for.body.preheader: ; preds = %entry173 br label %for.body174 175for.body: ; preds = %for.body.preheader, %for.body176 %indvars.iv = phi i16 [ %math, %for.body ], [ %start, %for.body.preheader ]177 %0 = call { i16, i1 } @llvm.uadd.with.overflow.i16(i16 %indvars.iv, i16 1)178 %math = extractvalue { i16, i1 } %0, 0179 %ov = extractvalue { i16, i1 } %0, 1180 br i1 %ov, label %for.end, label %for.body181 182for.end: ; preds = %for.body, %entry183 ret void184}185 186define void @sadd_symbolic_start(i16 %start, i1 %arg) {187; CHECK-LABEL: 'sadd_symbolic_start'188; CHECK-NEXT: Determining loop execution counts for: @sadd_symbolic_start189; CHECK-NEXT: Loop %for.body: backedge-taken count is (32767 + (-1 * %start))190; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i16 -1191; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (32767 + (-1 * %start))192; CHECK-NEXT: Loop %for.body: Trip multiple is 1193;194entry:195 br i1 %arg, label %for.end, label %for.body.preheader196 197for.body.preheader: ; preds = %entry198 br label %for.body199 200for.body: ; preds = %for.body.preheader, %for.body201 %indvars.iv = phi i16 [ %math, %for.body ], [ %start, %for.body.preheader ]202 %0 = call { i16, i1 } @llvm.sadd.with.overflow.i16(i16 %indvars.iv, i16 1)203 %math = extractvalue { i16, i1 } %0, 0204 %ov = extractvalue { i16, i1 } %0, 1205 br i1 %ov, label %for.end, label %for.body206 207for.end: ; preds = %for.body, %entry208 ret void209}210 211define void @sadd_symbolic_start2(i16 %start, i1 %arg) {212; CHECK-LABEL: 'sadd_symbolic_start2'213; CHECK-NEXT: Determining loop execution counts for: @sadd_symbolic_start2214; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.215; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.216; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.217;218entry:219 br i1 %arg, label %for.end, label %for.body.preheader220 221for.body.preheader: ; preds = %entry222 br label %for.body223 224for.body: ; preds = %for.body.preheader, %for.body225 %indvars.iv = phi i16 [ %math, %for.body ], [ %start, %for.body.preheader ]226 %0 = call { i16, i1 } @llvm.sadd.with.overflow.i16(i16 %indvars.iv, i16 1)227 %math = extractvalue { i16, i1 } %0, 0228 %ov = extractvalue { i16, i1 } %0, 1229 %not = xor i1 true, %ov230 br i1 %not, label %for.body, label %for.end231 232for.end: ; preds = %for.body, %entry233 ret void234}235 236define void @sadd_symbolic_swapped(i16 %start, i1 %arg) {237; CHECK-LABEL: 'sadd_symbolic_swapped'238; CHECK-NEXT: Determining loop execution counts for: @sadd_symbolic_swapped239; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.240; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.241; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.242;243entry:244 br i1 %arg, label %for.end, label %for.body.preheader245 246for.body.preheader: ; preds = %entry247 br label %for.body248 249for.body: ; preds = %for.body.preheader, %for.body250 %indvars.iv = phi i16 [ %math, %for.body ], [ %start, %for.body.preheader ]251 %0 = call { i16, i1 } @llvm.sadd.with.overflow.i16(i16 %indvars.iv, i16 1)252 %math = extractvalue { i16, i1 } %0, 0253 %ov = extractvalue { i16, i1 } %0, 1254 br i1 %ov, label %for.body, label %for.end255 256for.end: ; preds = %for.body, %entry257 ret void258}259 260define void @usub_symbolic_start(i16 %start, i1 %arg) {261; CHECK-LABEL: 'usub_symbolic_start'262; CHECK-NEXT: Determining loop execution counts for: @usub_symbolic_start263; CHECK-NEXT: Loop %for.body: backedge-taken count is %start264; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i16 -1265; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is %start266; CHECK-NEXT: Loop %for.body: Trip multiple is 1267;268entry:269 br i1 %arg, label %for.end, label %for.body.preheader270 271for.body.preheader: ; preds = %entry272 br label %for.body273 274for.body: ; preds = %for.body.preheader, %for.body275 %indvars.iv = phi i16 [ %math, %for.body ], [ %start, %for.body.preheader ]276 %0 = call { i16, i1 } @llvm.usub.with.overflow.i16(i16 %indvars.iv, i16 1)277 %math = extractvalue { i16, i1 } %0, 0278 %ov = extractvalue { i16, i1 } %0, 1279 br i1 %ov, label %for.end, label %for.body280 281for.end: ; preds = %for.body, %entry282 ret void283}284 285define void @ssub_symbolic_start(i16 %start, i1 %arg) {286; CHECK-LABEL: 'ssub_symbolic_start'287; CHECK-NEXT: Determining loop execution counts for: @ssub_symbolic_start288; CHECK-NEXT: Loop %for.body: backedge-taken count is (-32768 + %start)289; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i16 -1290; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-32768 + %start)291; CHECK-NEXT: Loop %for.body: Trip multiple is 1292;293entry:294 br i1 %arg, label %for.end, label %for.body.preheader295 296for.body.preheader: ; preds = %entry297 br label %for.body298 299for.body: ; preds = %for.body.preheader, %for.body300 %indvars.iv = phi i16 [ %math, %for.body ], [ %start, %for.body.preheader ]301 %0 = call { i16, i1 } @llvm.ssub.with.overflow.i16(i16 %indvars.iv, i16 1)302 %math = extractvalue { i16, i1 } %0, 0303 %ov = extractvalue { i16, i1 } %0, 1304 br i1 %ov, label %for.end, label %for.body305 306for.end: ; preds = %for.body, %entry307 ret void308}309 310define void @smul_symbolic_start(i16 %start, i1 %arg) {311; CHECK-LABEL: 'smul_symbolic_start'312; CHECK-NEXT: Determining loop execution counts for: @smul_symbolic_start313; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.314; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.315; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.316;317entry:318 br i1 %arg, label %for.end, label %for.body.preheader319 320for.body.preheader: ; preds = %entry321 br label %for.body322 323for.body: ; preds = %for.body.preheader, %for.body324 %indvars.iv = phi i16 [ %math, %for.body ], [ %start, %for.body.preheader ]325 %0 = call { i16, i1 } @llvm.smul.with.overflow.i16(i16 %indvars.iv, i16 2)326 %math = extractvalue { i16, i1 } %0, 0327 %ov = extractvalue { i16, i1 } %0, 1328 br i1 %ov, label %for.end, label %for.body329 330for.end: ; preds = %for.body, %entry331 ret void332}333 334define void @umul_symbolic_start(i16 %start, i1 %arg) {335; CHECK-LABEL: 'umul_symbolic_start'336; CHECK-NEXT: Determining loop execution counts for: @umul_symbolic_start337; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.338; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.339; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.340;341entry:342 br i1 %arg, label %for.end, label %for.body.preheader343 344for.body.preheader: ; preds = %entry345 br label %for.body346 347for.body: ; preds = %for.body.preheader, %for.body348 %indvars.iv = phi i16 [ %math, %for.body ], [ %start, %for.body.preheader ]349 %0 = call { i16, i1 } @llvm.umul.with.overflow.i16(i16 %indvars.iv, i16 2)350 %math = extractvalue { i16, i1 } %0, 0351 %ov = extractvalue { i16, i1 } %0, 1352 br i1 %ov, label %for.end, label %for.body353 354for.end: ; preds = %for.body, %entry355 ret void356}357 358define void @sadd_symbolic_non_latch(i16 %start, i1 %arg) {359; CHECK-LABEL: 'sadd_symbolic_non_latch'360; CHECK-NEXT: Determining loop execution counts for: @sadd_symbolic_non_latch361; CHECK-NEXT: Loop %for.body: <multiple exits> backedge-taken count is ((230 + (-1 * %start)) umin (32767 + (-1 * %start)))362; CHECK-NEXT: exit count for for.body: (32767 + (-1 * %start))363; CHECK-NEXT: exit count for for.latch: (230 + (-1 * %start))364; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i16 -1365; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is ((230 + (-1 * %start)) umin (32767 + (-1 * %start)))366; CHECK-NEXT: symbolic max exit count for for.body: (32767 + (-1 * %start))367; CHECK-NEXT: symbolic max exit count for for.latch: (230 + (-1 * %start))368; CHECK-NEXT: Loop %for.body: Trip multiple is 1369;370entry:371 br i1 %arg, label %for.end, label %for.body.preheader372 373for.body.preheader: ; preds = %entry374 br label %for.body375 376for.body: ; preds = %for.body.preheader, %for.body377 %indvars.iv = phi i16 [ %math, %for.latch ], [ %start, %for.body.preheader ]378 %0 = call { i16, i1 } @llvm.sadd.with.overflow.i16(i16 %indvars.iv, i16 1)379 %math = extractvalue { i16, i1 } %0, 0380 %ov = extractvalue { i16, i1 } %0, 1381 br i1 %ov, label %for.end, label %for.latch382 383for.latch:384 %cmp = icmp eq i16 %math, 231385 br i1 %cmp, label %for.end, label %for.body386 387for.end: ; preds = %for.body, %entry388 ret void389}390