Skip to content

Commit b9f571f

Browse files
committed
[SCEV] Cover more multipler/divisor combinations in folding test.
Consolidate tests for multiple divisors in a single loop, add multiplies by 1, 2, 5, 6. Extends test coverage for llvm#157159.
1 parent 6343c9b commit b9f571f

File tree

1 file changed

+42
-104
lines changed

1 file changed

+42
-104
lines changed

llvm/test/Analysis/ScalarEvolution/mul-udiv-folds.ll

Lines changed: 42 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33

44
declare 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

8447
loop:
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

9263
exit:
9364
ret void
9465
}
95-
96-
9766
define 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

130107
loop:
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

138123
exit:
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

Comments
 (0)