@@ -51,3 +51,47 @@ b7: ; preds = %b3
5151b8: ; preds = %b1
5252 ret i32 7
5353}
54+
55+ ; Don't fold %indvar2 into (zext {0,+,1}) * %a
56+ define i64 @test_poisonous (i64 %a , i32 %n ) {
57+ ; CHECK-LABEL: 'test_poisonous'
58+ ; CHECK-NEXT: Classifying expressions for: @test_poisonous
59+ ; CHECK-NEXT: %indvar1 = phi i32 [ 0, %entry ], [ %indvar1.next, %loop.body ]
60+ ; CHECK-NEXT: --> {0,+,1}<%loop.body> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop.body: Computable }
61+ ; CHECK-NEXT: %indvar2 = phi i64 [ 0, %entry ], [ %mul, %loop.body ]
62+ ; CHECK-NEXT: --> %indvar2 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop.body: Variant }
63+ ; CHECK-NEXT: %indvar1.next = add i32 %indvar1, 1
64+ ; CHECK-NEXT: --> {1,+,1}<%loop.body> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop.body: Computable }
65+ ; CHECK-NEXT: %ext = zext i32 %indvar1.next to i64
66+ ; CHECK-NEXT: --> (zext i32 {1,+,1}<%loop.body> to i64) U: [0,4294967296) S: [0,4294967296) Exits: <<Unknown>> LoopDispositions: { %loop.body: Computable }
67+ ; CHECK-NEXT: %mul = mul i64 %ext, %a
68+ ; CHECK-NEXT: --> ((zext i32 {1,+,1}<%loop.body> to i64) * %a) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop.body: Computable }
69+ ; CHECK-NEXT: Determining loop execution counts for: @test_poisonous
70+ ; CHECK-NEXT: Loop %loop.body: Unpredictable backedge-taken count.
71+ ; CHECK-NEXT: Loop %loop.body: Unpredictable constant max backedge-taken count.
72+ ; CHECK-NEXT: Loop %loop.body: Unpredictable symbolic max backedge-taken count.
73+ ; CHECK-NEXT: Loop %loop.body: Predicated backedge-taken count is (-1 + (1 smax (1 + (sext i32 %n to i64))<nsw>))<nsw>
74+ ; CHECK-NEXT: Predicates:
75+ ; CHECK-NEXT: {1,+,1}<%loop.body> Added Flags: <nssw>
76+ ; CHECK-NEXT: Loop %loop.body: Predicated constant max backedge-taken count is i64 2147483647
77+ ; CHECK-NEXT: Predicates:
78+ ; CHECK-NEXT: {1,+,1}<%loop.body> Added Flags: <nssw>
79+ ; CHECK-NEXT: Loop %loop.body: Predicated symbolic max backedge-taken count is (-1 + (1 smax (1 + (sext i32 %n to i64))<nsw>))<nsw>
80+ ; CHECK-NEXT: Predicates:
81+ ; CHECK-NEXT: {1,+,1}<%loop.body> Added Flags: <nssw>
82+ ;
83+ entry:
84+ br label %loop.body
85+
86+ loop.body:
87+ %indvar1 = phi i32 [ 0 , %entry ], [ %indvar1.next , %loop.body ]
88+ %indvar2 = phi i64 [ 0 , %entry ], [ %mul , %loop.body ]
89+ %indvar1.next = add i32 %indvar1 , 1
90+ %ext = zext i32 %indvar1.next to i64
91+ %mul = mul i64 %ext , %a
92+ %exitcond = icmp sgt i32 %indvar1.next , %n
93+ br i1 %exitcond , label %loop.exit , label %loop.body
94+
95+ loop.exit:
96+ ret i64 %mul
97+ }
0 commit comments