xref: /llvm-project/llvm/test/Transforms/LoopStrengthReduce/depth-limit-overrun.ll (revision 3d7242f05e6ebae394fe47039abb0568083209a0)
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