19d2349c7SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 29d2349c7SFlorian Hahn; RUN: opt -passes 'loop-reduce' -scalar-evolution-max-arith-depth=2 -S < %s | FileCheck --check-prefixes=DEFAULT %s 39d2349c7SFlorian Hahn; RUN: opt -loop-reduce -scalar-evolution-max-arith-depth=2 -S < %s | FileCheck --check-prefixes=LIMIT %s 49d2349c7SFlorian Hahn 59d2349c7SFlorian Hahn; This test should just compile cleanly without assertions. 69d2349c7SFlorian Hahn 79d2349c7SFlorian Hahntarget datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128-ni:1-p2:32:8:8:32-ni:2" 89d2349c7SFlorian Hahn 99d2349c7SFlorian Hahndefine void @test(i32 %A, i32 %B, i32 %C) { 109d2349c7SFlorian Hahn; DEFAULT-LABEL: @test( 119d2349c7SFlorian Hahn; DEFAULT-NEXT: entry: 129d2349c7SFlorian Hahn; DEFAULT-NEXT: [[TMP0:%.*]] = mul i32 [[C:%.*]], -3 139d2349c7SFlorian Hahn; DEFAULT-NEXT: br label [[OUTER_LOOP:%.*]] 149d2349c7SFlorian Hahn; DEFAULT: outer_loop: 159d2349c7SFlorian Hahn; DEFAULT-NEXT: [[PHI2:%.*]] = phi i32 [ [[A:%.*]], [[ENTRY:%.*]] ], [ 204, [[OUTER_TAIL:%.*]] ] 169d2349c7SFlorian Hahn; DEFAULT-NEXT: [[PHI3:%.*]] = phi i32 [ [[A]], [[ENTRY]] ], [ 243, [[OUTER_TAIL]] ] 179d2349c7SFlorian Hahn; DEFAULT-NEXT: [[PHI4:%.*]] = phi i32 [ [[B:%.*]], [[ENTRY]] ], [ [[I35:%.*]], [[OUTER_TAIL]] ] 189d2349c7SFlorian Hahn; DEFAULT-NEXT: br label [[GUARD:%.*]] 199d2349c7SFlorian Hahn; DEFAULT: guard: 209d2349c7SFlorian Hahn; DEFAULT-NEXT: [[LCMP_MOD:%.*]] = icmp eq i32 [[C]], 0 219d2349c7SFlorian Hahn; DEFAULT-NEXT: br i1 [[LCMP_MOD]], label [[OUTER_TAIL]], label [[PREHEADER:%.*]] 229d2349c7SFlorian Hahn; DEFAULT: preheader: 239d2349c7SFlorian Hahn; DEFAULT-NEXT: [[I15:%.*]] = shl i32 [[B]], 1 249d2349c7SFlorian Hahn; DEFAULT-NEXT: [[TMP1:%.*]] = mul i32 [[PHI2]], -1 259d2349c7SFlorian Hahn; DEFAULT-NEXT: [[TMP2:%.*]] = mul i32 [[TMP1]], -1 269d2349c7SFlorian Hahn; DEFAULT-NEXT: [[TMP3:%.*]] = sub i32 [[PHI4]], [[TMP2]] 279d2349c7SFlorian Hahn; DEFAULT-NEXT: [[TMP4:%.*]] = add i32 [[B]], [[PHI4]] 289d2349c7SFlorian Hahn; DEFAULT-NEXT: [[TMP5:%.*]] = sub i32 [[TMP4]], [[TMP2]] 299d2349c7SFlorian Hahn; DEFAULT-NEXT: [[TMP6:%.*]] = sub i32 14, [[TMP5]] 309d2349c7SFlorian Hahn; DEFAULT-NEXT: [[TMP7:%.*]] = add i32 [[TMP0]], [[PHI2]] 319d2349c7SFlorian Hahn; DEFAULT-NEXT: br label [[INNER_LOOP:%.*]] 329d2349c7SFlorian Hahn; DEFAULT: inner_loop: 339d2349c7SFlorian Hahn; DEFAULT-NEXT: [[LSR_IV3:%.*]] = phi i32 [ [[LSR_IV_NEXT4:%.*]], [[INNER_LOOP]] ], [ [[TMP6]], [[PREHEADER]] ] 349d2349c7SFlorian Hahn; DEFAULT-NEXT: [[LSR_IV1:%.*]] = phi i32 [ [[LSR_IV_NEXT2:%.*]], [[INNER_LOOP]] ], [ [[TMP5]], [[PREHEADER]] ] 359d2349c7SFlorian Hahn; DEFAULT-NEXT: [[LSR_IV:%.*]] = phi i32 [ [[LSR_IV_NEXT:%.*]], [[INNER_LOOP]] ], [ [[TMP3]], [[PREHEADER]] ] 369d2349c7SFlorian Hahn; DEFAULT-NEXT: [[PHI5:%.*]] = phi i32 [ [[PHI3]], [[PREHEADER]] ], [ [[I30:%.*]], [[INNER_LOOP]] ] 379d2349c7SFlorian Hahn; DEFAULT-NEXT: [[PHI6:%.*]] = phi i32 [ [[PHI2]], [[PREHEADER]] ], [ [[I33:%.*]], [[INNER_LOOP]] ] 389d2349c7SFlorian Hahn; DEFAULT-NEXT: [[ITER:%.*]] = phi i32 [ [[C]], [[PREHEADER]] ], [ [[ITER_SUB:%.*]], [[INNER_LOOP]] ] 399d2349c7SFlorian Hahn; DEFAULT-NEXT: [[I17:%.*]] = sub i32 [[PHI4]], [[PHI6]] 409d2349c7SFlorian Hahn; DEFAULT-NEXT: [[I18:%.*]] = sub i32 14, [[PHI5]] 419d2349c7SFlorian Hahn; DEFAULT-NEXT: [[I19:%.*]] = mul i32 [[I18]], [[C]] 429d2349c7SFlorian Hahn; DEFAULT-NEXT: [[FACTOR_PROL:%.*]] = shl i32 [[PHI5]], 1 439d2349c7SFlorian Hahn; DEFAULT-NEXT: [[TMP8:%.*]] = add i32 [[LSR_IV1]], [[I19]] 449d2349c7SFlorian Hahn; DEFAULT-NEXT: [[TMP9:%.*]] = add i32 [[TMP8]], [[FACTOR_PROL]] 459d2349c7SFlorian Hahn; DEFAULT-NEXT: [[TMP10:%.*]] = shl i32 [[TMP9]], 1 469d2349c7SFlorian Hahn; DEFAULT-NEXT: [[TMP11:%.*]] = add i32 [[LSR_IV]], [[TMP10]] 479d2349c7SFlorian Hahn; DEFAULT-NEXT: [[TMP12:%.*]] = sub i32 [[LSR_IV3]], [[I19]] 489d2349c7SFlorian Hahn; DEFAULT-NEXT: [[TMP13:%.*]] = sub i32 [[TMP12]], [[FACTOR_PROL]] 499d2349c7SFlorian Hahn; DEFAULT-NEXT: [[TMP14:%.*]] = mul i32 [[C]], [[TMP13]] 509d2349c7SFlorian Hahn; DEFAULT-NEXT: [[TMP15:%.*]] = add i32 [[LSR_IV1]], [[I19]] 519d2349c7SFlorian Hahn; DEFAULT-NEXT: [[TMP16:%.*]] = add i32 [[TMP15]], [[FACTOR_PROL]] 529d2349c7SFlorian Hahn; DEFAULT-NEXT: [[TMP17:%.*]] = shl i32 [[TMP16]], 1 539d2349c7SFlorian Hahn; DEFAULT-NEXT: [[TMP18:%.*]] = add i32 [[TMP14]], [[TMP17]] 549d2349c7SFlorian Hahn; DEFAULT-NEXT: [[TMP19:%.*]] = add i32 [[LSR_IV]], [[TMP18]] 559d2349c7SFlorian Hahn; DEFAULT-NEXT: [[I29:%.*]] = mul i32 [[TMP11]], [[C]] 569d2349c7SFlorian Hahn; DEFAULT-NEXT: [[FACTOR_2_PROL:%.*]] = shl i32 [[TMP19]], 1 579d2349c7SFlorian Hahn; DEFAULT-NEXT: [[I30]] = add i32 [[I17]], [[FACTOR_2_PROL]] 589d2349c7SFlorian Hahn; DEFAULT-NEXT: [[I33]] = add i32 [[PHI6]], -3 599d2349c7SFlorian Hahn; DEFAULT-NEXT: [[ITER_SUB]] = add i32 [[ITER]], -1 609d2349c7SFlorian Hahn; DEFAULT-NEXT: [[LSR_IV_NEXT]] = add i32 [[LSR_IV]], 3 619d2349c7SFlorian Hahn; DEFAULT-NEXT: [[LSR_IV_NEXT2]] = add i32 [[LSR_IV1]], 3 629d2349c7SFlorian Hahn; DEFAULT-NEXT: [[LSR_IV_NEXT4]] = add i32 [[LSR_IV3]], -3 639d2349c7SFlorian Hahn; DEFAULT-NEXT: [[ITER_CMP:%.*]] = icmp eq i32 [[ITER_SUB]], 0 649d2349c7SFlorian Hahn; DEFAULT-NEXT: br i1 [[ITER_CMP]], label [[OUTER_TAIL_LOOPEXIT:%.*]], label [[INNER_LOOP]] 659d2349c7SFlorian Hahn; DEFAULT: outer_tail.loopexit: 669d2349c7SFlorian Hahn; DEFAULT-NEXT: br label [[OUTER_TAIL]] 679d2349c7SFlorian Hahn; DEFAULT: outer_tail: 689d2349c7SFlorian Hahn; DEFAULT-NEXT: [[PHI7:%.*]] = phi i32 [ [[PHI2]], [[GUARD]] ], [ [[TMP7]], [[OUTER_TAIL_LOOPEXIT]] ] 699d2349c7SFlorian Hahn; DEFAULT-NEXT: [[I35]] = sub i32 [[A]], [[PHI7]] 709d2349c7SFlorian Hahn; DEFAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[I35]], 9876 719d2349c7SFlorian Hahn; DEFAULT-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[OUTER_LOOP]] 729d2349c7SFlorian Hahn; DEFAULT: exit: 739d2349c7SFlorian Hahn; DEFAULT-NEXT: ret void 749d2349c7SFlorian Hahn; 759d2349c7SFlorian Hahn; LIMIT-LABEL: @test( 769d2349c7SFlorian Hahn; LIMIT-NEXT: entry: 77*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[TMP0:%.*]] = mul i32 [[C:%.*]], -3 789d2349c7SFlorian Hahn; LIMIT-NEXT: br label [[OUTER_LOOP:%.*]] 799d2349c7SFlorian Hahn; LIMIT: outer_loop: 809d2349c7SFlorian Hahn; LIMIT-NEXT: [[PHI2:%.*]] = phi i32 [ [[A:%.*]], [[ENTRY:%.*]] ], [ 204, [[OUTER_TAIL:%.*]] ] 819d2349c7SFlorian Hahn; LIMIT-NEXT: [[PHI3:%.*]] = phi i32 [ [[A]], [[ENTRY]] ], [ 243, [[OUTER_TAIL]] ] 829d2349c7SFlorian Hahn; LIMIT-NEXT: [[PHI4:%.*]] = phi i32 [ [[B:%.*]], [[ENTRY]] ], [ [[I35:%.*]], [[OUTER_TAIL]] ] 839d2349c7SFlorian Hahn; LIMIT-NEXT: br label [[GUARD:%.*]] 849d2349c7SFlorian Hahn; LIMIT: guard: 85*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[LCMP_MOD:%.*]] = icmp eq i32 [[C]], 0 869d2349c7SFlorian Hahn; LIMIT-NEXT: br i1 [[LCMP_MOD]], label [[OUTER_TAIL]], label [[PREHEADER:%.*]] 879d2349c7SFlorian Hahn; LIMIT: preheader: 889d2349c7SFlorian Hahn; LIMIT-NEXT: [[I15:%.*]] = shl i32 [[B]], 1 89*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[TMP1:%.*]] = mul i32 [[PHI2]], -1 90*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[TMP2:%.*]] = mul i32 [[TMP1]], -1 91*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[TMP3:%.*]] = sub i32 [[PHI4]], [[TMP2]] 92*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[TMP4:%.*]] = add i32 [[B]], [[PHI4]] 93*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[TMP5:%.*]] = sub i32 [[TMP4]], [[TMP2]] 94*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[TMP6:%.*]] = sub i32 14, [[TMP5]] 95*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[TMP7:%.*]] = add i32 [[TMP0]], [[PHI2]] 969d2349c7SFlorian Hahn; LIMIT-NEXT: br label [[INNER_LOOP:%.*]] 979d2349c7SFlorian Hahn; LIMIT: inner_loop: 98*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[LSR_IV3:%.*]] = phi i32 [ [[LSR_IV_NEXT4:%.*]], [[INNER_LOOP]] ], [ [[TMP6]], [[PREHEADER]] ] 99*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[LSR_IV1:%.*]] = phi i32 [ [[LSR_IV_NEXT2:%.*]], [[INNER_LOOP]] ], [ [[TMP5]], [[PREHEADER]] ] 100*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[LSR_IV:%.*]] = phi i32 [ [[LSR_IV_NEXT:%.*]], [[INNER_LOOP]] ], [ [[TMP3]], [[PREHEADER]] ] 1019d2349c7SFlorian Hahn; LIMIT-NEXT: [[PHI5:%.*]] = phi i32 [ [[PHI3]], [[PREHEADER]] ], [ [[I30:%.*]], [[INNER_LOOP]] ] 1029d2349c7SFlorian Hahn; LIMIT-NEXT: [[PHI6:%.*]] = phi i32 [ [[PHI2]], [[PREHEADER]] ], [ [[I33:%.*]], [[INNER_LOOP]] ] 1039d2349c7SFlorian Hahn; LIMIT-NEXT: [[ITER:%.*]] = phi i32 [ [[C]], [[PREHEADER]] ], [ [[ITER_SUB:%.*]], [[INNER_LOOP]] ] 1049d2349c7SFlorian Hahn; LIMIT-NEXT: [[I17:%.*]] = sub i32 [[PHI4]], [[PHI6]] 1059d2349c7SFlorian Hahn; LIMIT-NEXT: [[I18:%.*]] = sub i32 14, [[PHI5]] 1069d2349c7SFlorian Hahn; LIMIT-NEXT: [[I19:%.*]] = mul i32 [[I18]], [[C]] 1079d2349c7SFlorian Hahn; LIMIT-NEXT: [[FACTOR_PROL:%.*]] = shl i32 [[PHI5]], 1 108*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[TMP8:%.*]] = add i32 [[LSR_IV1]], [[I19]] 109*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[TMP9:%.*]] = add i32 [[TMP8]], [[FACTOR_PROL]] 110*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[TMP10:%.*]] = shl i32 [[TMP9]], 1 111*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[TMP11:%.*]] = add i32 [[LSR_IV]], [[TMP10]] 112*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[TMP12:%.*]] = sub i32 [[LSR_IV3]], [[I19]] 113*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[TMP13:%.*]] = sub i32 [[TMP12]], [[FACTOR_PROL]] 114*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[TMP14:%.*]] = mul i32 [[C]], [[TMP13]] 115*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[TMP15:%.*]] = add i32 [[LSR_IV1]], [[I19]] 116*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[TMP16:%.*]] = add i32 [[TMP15]], [[FACTOR_PROL]] 117*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[TMP17:%.*]] = shl i32 [[TMP16]], 1 118*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[TMP18:%.*]] = add i32 [[TMP14]], [[TMP17]] 119*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[TMP19:%.*]] = add i32 [[LSR_IV]], [[TMP18]] 120*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[I29:%.*]] = mul i32 [[TMP11]], [[C]] 121*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[FACTOR_2_PROL:%.*]] = shl i32 [[TMP19]], 1 1229d2349c7SFlorian Hahn; LIMIT-NEXT: [[I30]] = add i32 [[I17]], [[FACTOR_2_PROL]] 1239d2349c7SFlorian Hahn; LIMIT-NEXT: [[I33]] = add i32 [[PHI6]], -3 1249d2349c7SFlorian Hahn; LIMIT-NEXT: [[ITER_SUB]] = add i32 [[ITER]], -1 1259d2349c7SFlorian Hahn; LIMIT-NEXT: [[LSR_IV_NEXT]] = add i32 [[LSR_IV]], 3 1269d2349c7SFlorian Hahn; LIMIT-NEXT: [[LSR_IV_NEXT2]] = add i32 [[LSR_IV1]], 3 1279d2349c7SFlorian Hahn; LIMIT-NEXT: [[LSR_IV_NEXT4]] = add i32 [[LSR_IV3]], -3 1289d2349c7SFlorian Hahn; LIMIT-NEXT: [[ITER_CMP:%.*]] = icmp eq i32 [[ITER_SUB]], 0 1299d2349c7SFlorian Hahn; LIMIT-NEXT: br i1 [[ITER_CMP]], label [[OUTER_TAIL_LOOPEXIT:%.*]], label [[INNER_LOOP]] 1309d2349c7SFlorian Hahn; LIMIT: outer_tail.loopexit: 1319d2349c7SFlorian Hahn; LIMIT-NEXT: br label [[OUTER_TAIL]] 1329d2349c7SFlorian Hahn; LIMIT: outer_tail: 133*3d7242f0SDmitry Makogon; LIMIT-NEXT: [[PHI7:%.*]] = phi i32 [ [[PHI2]], [[GUARD]] ], [ [[TMP7]], [[OUTER_TAIL_LOOPEXIT]] ] 1349d2349c7SFlorian Hahn; LIMIT-NEXT: [[I35]] = sub i32 [[A]], [[PHI7]] 1359d2349c7SFlorian Hahn; LIMIT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[I35]], 9876 1369d2349c7SFlorian Hahn; LIMIT-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[OUTER_LOOP]] 1379d2349c7SFlorian Hahn; LIMIT: exit: 1389d2349c7SFlorian Hahn; LIMIT-NEXT: ret void 1399d2349c7SFlorian Hahn; 1409d2349c7SFlorian Hahnentry: 1419d2349c7SFlorian Hahn br label %outer_loop 1429d2349c7SFlorian Hahn 1439d2349c7SFlorian Hahnouter_loop: 1449d2349c7SFlorian Hahn %phi2 = phi i32 [ %A, %entry ], [ 204, %outer_tail ] 1459d2349c7SFlorian Hahn %phi3 = phi i32 [ %A, %entry ], [ 243, %outer_tail ] 1469d2349c7SFlorian Hahn %phi4 = phi i32 [ %B, %entry ], [ %i35, %outer_tail ] 1479d2349c7SFlorian Hahn br label %guard 1489d2349c7SFlorian Hahn 1499d2349c7SFlorian Hahnguard: 1509d2349c7SFlorian Hahn %lcmp.mod = icmp eq i32 %C, 0 1519d2349c7SFlorian Hahn br i1 %lcmp.mod, label %outer_tail, label %preheader 1529d2349c7SFlorian Hahn 1539d2349c7SFlorian Hahnpreheader: 1549d2349c7SFlorian Hahn %i15 = shl i32 %B, 1 1559d2349c7SFlorian Hahn br label %inner_loop 1569d2349c7SFlorian Hahn 1579d2349c7SFlorian Hahninner_loop: 1589d2349c7SFlorian Hahn %phi5 = phi i32 [ %phi3, %preheader ], [ %i30, %inner_loop ] 1599d2349c7SFlorian Hahn %phi6 = phi i32 [ %phi2, %preheader ], [ %i33, %inner_loop ] 1609d2349c7SFlorian Hahn %iter = phi i32 [ %C, %preheader ], [ %iter.sub, %inner_loop ] 1619d2349c7SFlorian Hahn %i17 = sub i32 %phi4, %phi6 1629d2349c7SFlorian Hahn %i18 = sub i32 14, %phi5 1639d2349c7SFlorian Hahn %i19 = mul i32 %i18, %C 1649d2349c7SFlorian Hahn %factor.prol = shl i32 %phi5, 1 1659d2349c7SFlorian Hahn %i20 = add i32 %i17, %factor.prol 1669d2349c7SFlorian Hahn %i21 = add i32 %i20, %B 1679d2349c7SFlorian Hahn %i22 = add i32 %i21, %i19 1689d2349c7SFlorian Hahn %i23 = sub i32 14, %i22 1699d2349c7SFlorian Hahn %i24 = mul i32 %i23, %C 1709d2349c7SFlorian Hahn %factor.1.prol = shl i32 %i22, 1 1719d2349c7SFlorian Hahn %i25 = add i32 %i17, %factor.1.prol 1729d2349c7SFlorian Hahn %i27 = add i32 %i25, %i24 1739d2349c7SFlorian Hahn %i29 = mul i32 %i25, %C 1749d2349c7SFlorian Hahn %factor.2.prol = shl i32 %i27, 1 1759d2349c7SFlorian Hahn %i30 = add i32 %i17, %factor.2.prol 1769d2349c7SFlorian Hahn %i33 = add nsw i32 %phi6, -3 1779d2349c7SFlorian Hahn %iter.sub = add i32 %iter, -1 1789d2349c7SFlorian Hahn %iter.cmp = icmp eq i32 %iter.sub, 0 1799d2349c7SFlorian Hahn br i1 %iter.cmp, label %outer_tail, label %inner_loop 1809d2349c7SFlorian Hahn 1819d2349c7SFlorian Hahnouter_tail: 1829d2349c7SFlorian Hahn %phi7 = phi i32 [ %phi2, %guard ], [ %i33, %inner_loop ] 1839d2349c7SFlorian Hahn %i35 = sub i32 %A, %phi7 1849d2349c7SFlorian Hahn %cmp = icmp sgt i32 %i35, 9876 1859d2349c7SFlorian Hahn br i1 %cmp, label %exit, label %outer_loop 1869d2349c7SFlorian Hahn 1879d2349c7SFlorian Hahnexit: 1889d2349c7SFlorian Hahn ret void 1899d2349c7SFlorian Hahn 1909d2349c7SFlorian Hahn} 191