@@ -104,3 +104,56 @@ exit:
104104}
105105
106106declare void @clobber ()
107+
108+
109+ declare void @clobber.i32 (i32 )
110+
111+ define void @test_guards_across_loops (i32 %N ) {
112+ ; CHECK-LABEL: 'test_guards_across_loops'
113+ ; CHECK-NEXT: Classifying expressions for: @test_guards_across_loops
114+ ; CHECK-NEXT: %iv.1 = phi i32 [ 0, %entry ], [ %iv.1.next, %loop.1 ]
115+ ; CHECK-NEXT: --> {0,+,1}<%loop.1> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop.1: Computable }
116+ ; CHECK-NEXT: %iv.1.next = add i32 %iv.1, 1
117+ ; CHECK-NEXT: --> {1,+,1}<%loop.1> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop.1: Computable }
118+ ; CHECK-NEXT: %iv.2 = phi i32 [ 0, %loop.1 ], [ %iv.2.next, %loop.2 ]
119+ ; CHECK-NEXT: --> {0,+,1}<nuw><%loop.2> U: full-set S: full-set Exits: (1 + %N) LoopDispositions: { %loop.2: Computable }
120+ ; CHECK-NEXT: %iv.2.next = add i32 %iv.2, 1
121+ ; CHECK-NEXT: --> {1,+,1}<nw><%loop.2> U: full-set S: full-set Exits: (2 + %N) LoopDispositions: { %loop.2: Computable }
122+ ; CHECK-NEXT: Determining loop execution counts for: @test_guards_across_loops
123+ ; CHECK-NEXT: Loop %loop.2: backedge-taken count is (1 + (zext i32 %N to i64))<nuw><nsw>
124+ ; CHECK-NEXT: Loop %loop.2: constant max backedge-taken count is i64 4294967296
125+ ; CHECK-NEXT: Loop %loop.2: symbolic max backedge-taken count is (1 + (zext i32 %N to i64))<nuw><nsw>
126+ ; CHECK-NEXT: Loop %loop.2: Trip multiple is 1
127+ ; CHECK-NEXT: Loop %loop.1: Unpredictable backedge-taken count.
128+ ; CHECK-NEXT: Loop %loop.1: Unpredictable constant max backedge-taken count.
129+ ; CHECK-NEXT: Loop %loop.1: Unpredictable symbolic max backedge-taken count.
130+ ; CHECK-NEXT: Loop %loop.1: Predicated backedge-taken count is (1 + (zext i32 %N to i64))<nuw><nsw>
131+ ; CHECK-NEXT: Predicates:
132+ ; CHECK-NEXT: {0,+,1}<%loop.1> Added Flags: <nusw>
133+ ; CHECK-NEXT: Loop %loop.1: Predicated constant max backedge-taken count is i64 4294967296
134+ ; CHECK-NEXT: Predicates:
135+ ; CHECK-NEXT: {0,+,1}<%loop.1> Added Flags: <nusw>
136+ ; CHECK-NEXT: Loop %loop.1: Predicated symbolic max backedge-taken count is (1 + (zext i32 %N to i64))<nuw><nsw>
137+ ; CHECK-NEXT: Predicates:
138+ ; CHECK-NEXT: {0,+,1}<%loop.1> Added Flags: <nusw>
139+ ;
140+ entry:
141+ br label %loop.1
142+
143+ loop.1 :
144+ %iv.1 = phi i32 [ 0 , %entry ], [ %iv.1.next , %loop.1 ]
145+ call void @clobber.i32 (i32 %iv.1 )
146+ %ec.1 = icmp ugt i32 %iv.1 , %N
147+ %iv.1.next = add i32 %iv.1 , 1
148+ br i1 %ec.1 , label %loop.2 , label %loop.1
149+
150+ loop.2 :
151+ %iv.2 = phi i32 [ 0 , %loop.1 ], [ %iv.2.next , %loop.2 ]
152+ call void @clobber.i32 (i32 %iv.2 )
153+ %ec.2 = icmp ugt i32 %iv.2 , %N
154+ %iv.2.next = add i32 %iv.2 , 1
155+ br i1 %ec.2 , label %exit , label %loop.2
156+
157+ exit:
158+ ret void
159+ }
0 commit comments