33
44declare void @use (ptr )
55
6- define void @udiv4_and_udiv2_mul_4 (i1 %c , ptr %A ) {
7- ; CHECK-LABEL: 'udiv4_and_udiv2_mul_4 '
8- ; CHECK-NEXT: Classifying expressions for: @udiv4_and_udiv2_mul_4
6+ define void @udiv4_and_udiv2 (i1 %c , ptr %A ) {
7+ ; CHECK-LABEL: 'udiv4_and_udiv2 '
8+ ; CHECK-NEXT: Classifying expressions for: @udiv4_and_udiv2
99; CHECK-NEXT: %start = select i1 %c, i32 512, i32 0
1010; CHECK-NEXT: --> %start U: [0,513) S: [0,513)
1111; CHECK-NEXT: %div.2 = lshr i32 %start, 1
@@ -18,56 +18,19 @@ define void @udiv4_and_udiv2_mul_4(i1 %c, ptr %A) {
1818; CHECK-NEXT: --> ((zext i32 %start to i64) /u 2) U: [0,257) S: [0,257)
1919; CHECK-NEXT: %iv = phi i64 [ %iv.start, %entry ], [ %iv.next, %loop ]
2020; CHECK-NEXT: --> {((zext i32 %start to i64) /u 4),+,1}<%loop> U: full-set S: full-set Exits: ((zext i32 %start to i64) /u 2) LoopDispositions: { %loop: Computable }
21- ; CHECK-NEXT: %gep = getelementptr i32, ptr %A, i64 %iv
22- ; CHECK-NEXT: --> {((zext i32 %start to i64) + %A),+,4}<%loop> U: full-set S: full-set Exits: ((zext i32 %start to i64) + (4 * ((zext i32 %start to i64) /u 2))<nuw><nsw> + (-4 * ((zext i32 %start to i64) /u 4))<nsw> + %A) LoopDispositions: { %loop: Computable }
23- ; CHECK-NEXT: %iv.next = add i64 %iv, 1
24- ; CHECK-NEXT: --> {(1 + ((zext i32 %start to i64) /u 4))<nuw><nsw>,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((zext i32 %start to i64) /u 2))<nuw><nsw> LoopDispositions: { %loop: Computable }
25- ; CHECK-NEXT: Determining loop execution counts for: @udiv4_and_udiv2_mul_4
26- ; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * ((zext i32 %start to i64) /u 4))<nsw> + ((zext i32 %start to i64) /u 2))
27- ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
28- ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * ((zext i32 %start to i64) /u 4))<nsw> + ((zext i32 %start to i64) /u 2))
29- ; CHECK-NEXT: Loop %loop: Trip multiple is 1
30- ;
31- entry:
32- %start = select i1 %c , i32 512 , i32 0
33- %div.2 = lshr i32 %start , 1
34- %div.4 = lshr i32 %start , 2
35- %iv.start = zext i32 %div.4 to i64
36- %wide.trip.count = zext i32 %div.2 to i64
37- br label %loop
38-
39- loop:
40- %iv = phi i64 [ %iv.start , %entry ], [ %iv.next , %loop ]
41- %gep = getelementptr i32 , ptr %A , i64 %iv
42- call void @use (ptr %gep )
43- %iv.next = add i64 %iv , 1
44- %ec = icmp eq i64 %iv , %wide.trip.count
45- br i1 %ec , label %exit , label %loop
46-
47- exit:
48- ret void
49- }
50-
51- define void @udiv4_and_udiv2_mul_1 (i1 %c , ptr %A ) {
52- ; CHECK-LABEL: 'udiv4_and_udiv2_mul_1'
53- ; CHECK-NEXT: Classifying expressions for: @udiv4_and_udiv2_mul_1
54- ; CHECK-NEXT: %start = select i1 %c, i32 512, i32 0
55- ; CHECK-NEXT: --> %start U: [0,513) S: [0,513)
56- ; CHECK-NEXT: %div.2 = lshr i32 %start, 1
57- ; CHECK-NEXT: --> (%start /u 2) U: [0,257) S: [0,257)
58- ; CHECK-NEXT: %div.4 = lshr i32 %start, 2
59- ; CHECK-NEXT: --> (%start /u 4) U: [0,129) S: [0,129)
60- ; CHECK-NEXT: %iv.start = zext i32 %div.4 to i64
61- ; CHECK-NEXT: --> ((zext i32 %start to i64) /u 4) U: [0,129) S: [0,129)
62- ; CHECK-NEXT: %wide.trip.count = zext i32 %div.2 to i64
63- ; CHECK-NEXT: --> ((zext i32 %start to i64) /u 2) U: [0,257) S: [0,257)
64- ; CHECK-NEXT: %iv = phi i64 [ %iv.start, %entry ], [ %iv.next, %loop ]
65- ; CHECK-NEXT: --> {((zext i32 %start to i64) /u 4),+,1}<%loop> U: full-set S: full-set Exits: ((zext i32 %start to i64) /u 2) LoopDispositions: { %loop: Computable }
66- ; CHECK-NEXT: %gep = getelementptr i8, ptr %A, i64 %iv
21+ ; CHECK-NEXT: %gep.8 = getelementptr i8, ptr %A, i64 %iv
6722; CHECK-NEXT: --> {(((zext i32 %start to i64) /u 4) + %A),+,1}<%loop> U: full-set S: full-set Exits: (((zext i32 %start to i64) /u 2) + %A) LoopDispositions: { %loop: Computable }
23+ ; CHECK-NEXT: %gep.16 = getelementptr i16, ptr %A, i64 %iv
24+ ; CHECK-NEXT: --> {((2 * ((zext i32 %start to i64) /u 4))<nuw><nsw> + %A),+,2}<%loop> U: full-set S: full-set Exits: ((zext i32 %start to i64) + %A) LoopDispositions: { %loop: Computable }
25+ ; CHECK-NEXT: %gep.32 = getelementptr i32, ptr %A, i64 %iv
26+ ; CHECK-NEXT: --> {((zext i32 %start to i64) + %A),+,4}<%loop> U: full-set S: full-set Exits: ((zext i32 %start to i64) + (4 * ((zext i32 %start to i64) /u 2))<nuw><nsw> + (-4 * ((zext i32 %start to i64) /u 4))<nsw> + %A) LoopDispositions: { %loop: Computable }
27+ ; CHECK-NEXT: %gep.40 = getelementptr <{ i32, i8 }>, ptr %A, i64 %iv
28+ ; CHECK-NEXT: --> {((5 * ((zext i32 %start to i64) /u 4))<nuw><nsw> + %A),+,5}<%loop> U: full-set S: full-set Exits: ((5 * ((zext i32 %start to i64) /u 2))<nuw><nsw> + %A) LoopDispositions: { %loop: Computable }
29+ ; CHECK-NEXT: %gep.48 = getelementptr <{ i32, i16 }>, ptr %A, i64 %iv
30+ ; CHECK-NEXT: --> {((6 * ((zext i32 %start to i64) /u 4))<nuw><nsw> + %A),+,6}<%loop> U: full-set S: full-set Exits: ((6 * ((zext i32 %start to i64) /u 2))<nuw><nsw> + %A) LoopDispositions: { %loop: Computable }
6831; CHECK-NEXT: %iv.next = add i64 %iv, 1
6932; CHECK-NEXT: --> {(1 + ((zext i32 %start to i64) /u 4))<nuw><nsw>,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((zext i32 %start to i64) /u 2))<nuw><nsw> LoopDispositions: { %loop: Computable }
70- ; CHECK-NEXT: Determining loop execution counts for: @udiv4_and_udiv2_mul_1
33+ ; CHECK-NEXT: Determining loop execution counts for: @udiv4_and_udiv2
7134; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * ((zext i32 %start to i64) /u 4))<nsw> + ((zext i32 %start to i64) /u 2))
7235; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
7336; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * ((zext i32 %start to i64) /u 4))<nsw> + ((zext i32 %start to i64) /u 2))
@@ -83,17 +46,23 @@ entry:
8346
8447loop:
8548 %iv = phi i64 [ %iv.start , %entry ], [ %iv.next , %loop ]
86- %gep = getelementptr i8 , ptr %A , i64 %iv
87- call void @use (ptr %gep )
49+ %gep.8 = getelementptr i8 , ptr %A , i64 %iv
50+ call void @use (ptr %gep.8 )
51+ %gep.16 = getelementptr i16 , ptr %A , i64 %iv
52+ call void @use (ptr %gep.16 )
53+ %gep.32 = getelementptr i32 , ptr %A , i64 %iv
54+ call void @use (ptr %gep.32 )
55+ %gep.40 = getelementptr <{i32 , i8 }>, ptr %A , i64 %iv
56+ call void @use (ptr %gep.40 )
57+ %gep.48 = getelementptr <{i32 , i16 }>, ptr %A , i64 %iv
58+ call void @use (ptr %gep.48 )
8859 %iv.next = add i64 %iv , 1
8960 %ec = icmp eq i64 %iv , %wide.trip.count
9061 br i1 %ec , label %exit , label %loop
9162
9263exit:
9364 ret void
9465}
95-
96-
9766define void @udiv3_and_udiv5_mul_4 (i1 %c , ptr %A ) {
9867; CHECK-LABEL: 'udiv3_and_udiv5_mul_4'
9968; CHECK-NEXT: Classifying expressions for: @udiv3_and_udiv5_mul_4
@@ -109,8 +78,16 @@ define void @udiv3_and_udiv5_mul_4(i1 %c, ptr %A) {
10978; CHECK-NEXT: --> ((zext i32 %start to i64) /u 3) U: [0,171) S: [0,171)
11079; CHECK-NEXT: %iv = phi i64 [ %iv.start, %entry ], [ %iv.next, %loop ]
11180; CHECK-NEXT: --> {((zext i32 %start to i64) /u 5),+,1}<%loop> U: full-set S: full-set Exits: ((zext i32 %start to i64) /u 3) LoopDispositions: { %loop: Computable }
112- ; CHECK-NEXT: %gep = getelementptr i8, ptr %A, i64 %iv
81+ ; CHECK-NEXT: %gep.8 = getelementptr i8, ptr %A, i64 %iv
11382; CHECK-NEXT: --> {(((zext i32 %start to i64) /u 5) + %A),+,1}<%loop> U: full-set S: full-set Exits: (((zext i32 %start to i64) /u 3) + %A) LoopDispositions: { %loop: Computable }
83+ ; CHECK-NEXT: %gep.16 = getelementptr i16, ptr %A, i64 %iv
84+ ; CHECK-NEXT: --> {((2 * ((zext i32 %start to i64) /u 5))<nuw><nsw> + %A),+,2}<%loop> U: full-set S: full-set Exits: ((2 * ((zext i32 %start to i64) /u 3))<nuw><nsw> + %A) LoopDispositions: { %loop: Computable }
85+ ; CHECK-NEXT: %gep.32 = getelementptr i32, ptr %A, i64 %iv
86+ ; CHECK-NEXT: --> {((4 * ((zext i32 %start to i64) /u 5))<nuw><nsw> + %A),+,4}<%loop> U: full-set S: full-set Exits: ((4 * ((zext i32 %start to i64) /u 3))<nuw><nsw> + %A) LoopDispositions: { %loop: Computable }
87+ ; CHECK-NEXT: %gep.40 = getelementptr <{ i32, i8 }>, ptr %A, i64 %iv
88+ ; CHECK-NEXT: --> {((5 * ((zext i32 %start to i64) /u 5))<nuw><nsw> + %A),+,5}<%loop> U: full-set S: full-set Exits: ((5 * ((zext i32 %start to i64) /u 3))<nuw><nsw> + %A) LoopDispositions: { %loop: Computable }
89+ ; CHECK-NEXT: %gep.48 = getelementptr <{ i32, i16 }>, ptr %A, i64 %iv
90+ ; CHECK-NEXT: --> {((6 * ((zext i32 %start to i64) /u 5))<nuw><nsw> + %A),+,6}<%loop> U: full-set S: full-set Exits: ((6 * ((zext i32 %start to i64) /u 3))<nuw><nsw> + %A) LoopDispositions: { %loop: Computable }
11491; CHECK-NEXT: %iv.next = add i64 %iv, 1
11592; CHECK-NEXT: --> {(1 + ((zext i32 %start to i64) /u 5))<nuw><nsw>,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((zext i32 %start to i64) /u 3))<nuw><nsw> LoopDispositions: { %loop: Computable }
11693; CHECK-NEXT: Determining loop execution counts for: @udiv3_and_udiv5_mul_4
@@ -129,59 +106,20 @@ entry:
129106
130107loop:
131108 %iv = phi i64 [ %iv.start , %entry ], [ %iv.next , %loop ]
132- %gep = getelementptr i8 , ptr %A , i64 %iv
133- call void @use (ptr %gep )
109+ %gep.8 = getelementptr i8 , ptr %A , i64 %iv
110+ call void @use (ptr %gep.8 )
111+ %gep.16 = getelementptr i16 , ptr %A , i64 %iv
112+ call void @use (ptr %gep.16 )
113+ %gep.32 = getelementptr i32 , ptr %A , i64 %iv
114+ call void @use (ptr %gep.32 )
115+ %gep.40 = getelementptr <{i32 , i8 }>, ptr %A , i64 %iv
116+ call void @use (ptr %gep.40 )
117+ %gep.48 = getelementptr <{i32 , i16 }>, ptr %A , i64 %iv
118+ call void @use (ptr %gep.48 )
134119 %iv.next = add i64 %iv , 1
135120 %ec = icmp eq i64 %iv , %wide.trip.count
136121 br i1 %ec , label %exit , label %loop
137122
138123exit:
139124 ret void
140125}
141-
142- define void @udiv4_and_udiv2_mul_4_dividend_multiple_of_2 (i1 %c , ptr %A ) {
143- ; CHECK-LABEL: 'udiv4_and_udiv2_mul_4_dividend_multiple_of_2'
144- ; CHECK-NEXT: Classifying expressions for: @udiv4_and_udiv2_mul_4_dividend_multiple_of_2
145- ; CHECK-NEXT: %start = select i1 %c, i32 514, i32 0
146- ; CHECK-NEXT: --> %start U: [0,515) S: [0,515)
147- ; CHECK-NEXT: %div.2 = lshr i32 %start, 1
148- ; CHECK-NEXT: --> (%start /u 2) U: [0,258) S: [0,258)
149- ; CHECK-NEXT: %div.4 = lshr i32 %start, 2
150- ; CHECK-NEXT: --> (%start /u 4) U: [0,129) S: [0,129)
151- ; CHECK-NEXT: %iv.start = zext i32 %div.4 to i64
152- ; CHECK-NEXT: --> ((zext i32 %start to i64) /u 4) U: [0,129) S: [0,129)
153- ; CHECK-NEXT: %wide.trip.count = zext i32 %div.2 to i64
154- ; CHECK-NEXT: --> ((zext i32 %start to i64) /u 2) U: [0,258) S: [0,258)
155- ; CHECK-NEXT: %iv = phi i64 [ %iv.start, %entry ], [ %iv.next, %loop ]
156- ; CHECK-NEXT: --> {((zext i32 %start to i64) /u 4),+,1}<%loop> U: full-set S: full-set Exits: ((zext i32 %start to i64) /u 2) LoopDispositions: { %loop: Computable }
157- ; CHECK-NEXT: %gep = getelementptr i32, ptr %A, i64 %iv
158- ; CHECK-NEXT: --> {((4 * ((zext i32 %start to i64) /u 4))<nuw><nsw> + %A),+,4}<%loop> U: full-set S: full-set Exits: ((4 * ((zext i32 %start to i64) /u 2))<nuw><nsw> + %A) LoopDispositions: { %loop: Computable }
159- ; CHECK-NEXT: %iv.next = add i64 %iv, 1
160- ; CHECK-NEXT: --> {(1 + ((zext i32 %start to i64) /u 4))<nuw><nsw>,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((zext i32 %start to i64) /u 2))<nuw><nsw> LoopDispositions: { %loop: Computable }
161- ; CHECK-NEXT: Determining loop execution counts for: @udiv4_and_udiv2_mul_4_dividend_multiple_of_2
162- ; CHECK-NEXT: Loop %loop: backedge-taken count is ((-1 * ((zext i32 %start to i64) /u 4))<nsw> + ((zext i32 %start to i64) /u 2))
163- ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1
164- ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-1 * ((zext i32 %start to i64) /u 4))<nsw> + ((zext i32 %start to i64) /u 2))
165- ; CHECK-NEXT: Loop %loop: Trip multiple is 1
166- ;
167- entry:
168- %start = select i1 %c , i32 514 , i32 0
169- %div.2 = lshr i32 %start , 1
170- %div.4 = lshr i32 %start , 2
171- %iv.start = zext i32 %div.4 to i64
172- %wide.trip.count = zext i32 %div.2 to i64
173- br label %loop
174-
175- loop:
176- %iv = phi i64 [ %iv.start , %entry ], [ %iv.next , %loop ]
177- %gep = getelementptr i32 , ptr %A , i64 %iv
178- call void @use (ptr %gep )
179- %iv.next = add i64 %iv , 1
180- %ec = icmp eq i64 %iv , %wide.trip.count
181- br i1 %ec , label %exit , label %loop
182-
183- exit:
184- ret void
185- }
186-
187-
0 commit comments