blob: 1b1903ca2eb4898118c204640224177d20d2b18f [file] [edit]
; RUN: opt -passes=indvars -disable-output %s
; Check that SCEV complexity comparisons in indvars avoid exponential work.
; The three multiplication chains repeatedly reuse each other's previous values,
; forming shared subexpressions. When distinct SCEVUnknowns compare equal,
; recursive comparisons revisit the same pairs of SCEVs many times. A total
; order lets comparisons stop at the first differing operand.
;
; This is a compile-time regression test: indvars should complete quickly.
; No particular transformed IR is required.
define void @test(i32 %a, i32 %b) {
entry:
br label %loop
loop:
%iv = phi i32 [ %next, %loop ], [ %a, %entry ]
%a0 = mul i32 %iv, %b
%b0 = mul i32 %a, %iv
%c0 = mul i32 %b, %a
%a1 = mul i32 %a0, %c0
%b1 = mul i32 %b0, %a0
%c1 = mul i32 %c0, %b0
%a2 = mul i32 %a1, %c1
%b2 = mul i32 %b1, %a1
%c2 = mul i32 %c1, %b1
%a3 = mul i32 %a2, %c2
%b3 = mul i32 %b2, %a2
%c3 = mul i32 %c2, %b2
%a4 = mul i32 %a3, %c3
%b4 = mul i32 %b3, %a3
%c4 = mul i32 %c3, %b3
%a5 = mul i32 %a4, %c4
%b5 = mul i32 %b4, %a4
%c5 = mul i32 %c4, %b4
%a6 = mul i32 %a5, %c5
%b6 = mul i32 %b5, %a5
%c6 = mul i32 %c5, %b5
%a7 = mul i32 %a6, %c6
%b7 = mul i32 %b6, %a6
%c7 = mul i32 %c6, %b6
%a8 = mul i32 %a7, %c7
%b8 = mul i32 %b7, %a7
%c8 = mul i32 %c7, %b7
%a9 = mul i32 %a8, %c8
%b9 = mul i32 %b8, %a8
%c9 = mul i32 %c8, %b8
%a10 = mul i32 %a9, %c9
%b10 = mul i32 %b9, %a9
%c10 = mul i32 %c9, %b9
%a11 = mul i32 %a10, %c10
%b11 = mul i32 %b10, %a10
%c11 = mul i32 %c10, %b10
%a12 = mul i32 %a11, %c11
%b12 = mul i32 %b11, %a11
%c12 = mul i32 %c11, %b11
%a13 = mul i32 %a12, %c12
%b13 = mul i32 %b12, %a12
%c13 = mul i32 %c12, %b12
%a14 = mul i32 %a13, %c13
%b14 = mul i32 %b13, %a13
%c14 = mul i32 %c13, %b13
%a15 = mul i32 %a14, %c14
%b15 = mul i32 %b14, %a14
%c15 = mul i32 %c14, %b14
%a16 = mul i32 %a15, %c15
%b16 = mul i32 %b15, %a15
%c16 = mul i32 %c15, %b15
%a17 = mul i32 %a16, %c16
%b17 = mul i32 %b16, %a16
%c17 = mul i32 %c16, %b16
%a18 = mul i32 %a17, %c17
%b18 = mul i32 %b17, %a17
%c18 = mul i32 %c17, %b17
%a19 = mul i32 %a18, %c18
%b19 = mul i32 %b18, %a18
%c19 = mul i32 %c18, %b18
%a20 = mul i32 %a19, %c19
%b20 = mul i32 %b19, %a19
%c20 = mul i32 %c19, %b19
%a21 = mul i32 %a20, %c20
%b21 = mul i32 %b20, %a20
%c21 = mul i32 %c20, %b20
%a22 = mul i32 %a21, %c21
%b22 = mul i32 %b21, %a21
%c22 = mul i32 %c21, %b21
%a23 = mul i32 %a22, %c22
%b23 = mul i32 %b22, %a22
%c23 = mul i32 %c22, %b22
%a24 = mul i32 %a23, %c23
%b24 = mul i32 %b23, %a23
%c24 = mul i32 %c23, %b23
%a25 = mul i32 %a24, %c24
%b25 = mul i32 %b24, %a24
%c25 = mul i32 %c24, %b24
%a26 = mul i32 %a25, %c25
%b26 = mul i32 %b25, %a25
%c26 = mul i32 %c25, %b25
%a27 = mul i32 %a26, %c26
%b27 = mul i32 %b26, %a26
%c27 = mul i32 %c26, %b26
%a28 = mul i32 %a27, %c27
%b28 = mul i32 %b27, %a27
%c28 = mul i32 %c27, %b27
%a29 = mul i32 %a28, %c28
%b29 = mul i32 %b28, %a28
%c29 = mul i32 %c28, %b28
%a30 = mul i32 %a29, %c29
%b30 = mul i32 %b29, %a29
%c30 = mul i32 %c29, %b29
%a31 = mul i32 %a30, %c30
%b31 = mul i32 %b30, %a30
%c31 = mul i32 %c30, %b30
%a32 = mul i32 %a31, %c31
%b32 = mul i32 %b31, %a31
%c32 = mul i32 %c31, %b31
%a33 = mul i32 %a32, %c32
%b33 = mul i32 %b32, %a32
%c33 = mul i32 %c32, %b32
%a34 = mul i32 %a33, %c33
%b34 = mul i32 %b33, %a33
%c34 = mul i32 %c33, %b33
%a35 = mul i32 %a34, %c34
%b35 = mul i32 %b34, %a34
%c35 = mul i32 %c34, %b34
%a36 = mul i32 %a35, %c35
%c36 = mul i32 %c35, %b35
%next = mul i32 %a36, %c36
; The untaken backedge still forms a loop that indvars analyzes.
br i1 false, label %loop, label %exit
exit:
ret void
}