|
1 | 1 | ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
2 | 2 | ; RUN: opt < %s -indvars -S | FileCheck %s
|
3 | 3 |
|
4 |
| -; This tests that the IV is not recomputed outside of the loop when it is known |
5 |
| -; to be computed by the loop and used in the loop any way. In the example below |
6 |
| -; although a's value can be computed outside of the loop, there is no benefit |
7 |
| -; in doing so as it has to be computed by the loop anyway. |
| 4 | +; This tests that the IV is recomputed outside of the loop even when it is known |
| 5 | +; to be computed by the loop and used in the loop any way, if it is cheap to do |
| 6 | +; so. In the example below the value can be computed outside of the loop, |
| 7 | +; and we should do so because after that IV is no longer used outside of |
| 8 | +; the loop, which is likely beneficial for vectorization. |
8 | 9 | ;
|
9 | 10 | ; extern void func(unsigned val);
|
10 | 11 | ;
|
@@ -35,8 +36,8 @@ define void @test(i32 %m) nounwind uwtable {
|
35 | 36 | ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 186
|
36 | 37 | ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]]
|
37 | 38 | ; CHECK: for.end:
|
38 |
| -; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ] |
39 |
| -; CHECK-NEXT: tail call void @func(i32 [[ADD_LCSSA]]) |
| 39 | +; CHECK-NEXT: [[TMP0:%.*]] = mul i32 [[M]], 186 |
| 40 | +; CHECK-NEXT: tail call void @func(i32 [[TMP0]]) |
40 | 41 | ; CHECK-NEXT: ret void
|
41 | 42 | ;
|
42 | 43 | entry:
|
@@ -69,8 +70,8 @@ define i32 @test2(i32 %m) nounwind uwtable {
|
69 | 70 | ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 186
|
70 | 71 | ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]]
|
71 | 72 | ; CHECK: for.end:
|
72 |
| -; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ] |
73 |
| -; CHECK-NEXT: ret i32 [[ADD_LCSSA]] |
| 73 | +; CHECK-NEXT: [[TMP0:%.*]] = mul i32 [[M]], 186 |
| 74 | +; CHECK-NEXT: ret i32 [[TMP0]] |
74 | 75 | ;
|
75 | 76 | entry:
|
76 | 77 | br label %for.body
|
@@ -101,8 +102,8 @@ define void @test3(i32 %m) nounwind uwtable {
|
101 | 102 | ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 186
|
102 | 103 | ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]]
|
103 | 104 | ; CHECK: for.end:
|
104 |
| -; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ] |
105 |
| -; CHECK-NEXT: tail call void @func(i32 [[ADD_LCSSA]]) |
| 105 | +; CHECK-NEXT: [[TMP0:%.*]] = mul i32 [[M]], 186 |
| 106 | +; CHECK-NEXT: tail call void @func(i32 [[TMP0]]) |
106 | 107 | ; CHECK-NEXT: ret void
|
107 | 108 | ;
|
108 | 109 | entry:
|
@@ -141,8 +142,8 @@ define void @test4(i32 %m) nounwind uwtable {
|
141 | 142 | ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 186
|
142 | 143 | ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]]
|
143 | 144 | ; CHECK: for.end:
|
144 |
| -; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ] |
145 |
| -; CHECK-NEXT: [[SOFT_USE:%.*]] = add i32 [[ADD_LCSSA]], 123 |
| 145 | +; CHECK-NEXT: [[TMP0:%.*]] = mul i32 [[M]], 186 |
| 146 | +; CHECK-NEXT: [[SOFT_USE:%.*]] = add i32 [[TMP0]], 123 |
146 | 147 | ; CHECK-NEXT: tail call void @func(i32 [[SOFT_USE]])
|
147 | 148 | ; CHECK-NEXT: ret void
|
148 | 149 | ;
|
@@ -178,8 +179,8 @@ define void @test5(i32 %m) nounwind uwtable {
|
178 | 179 | ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 186
|
179 | 180 | ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]]
|
180 | 181 | ; CHECK: for.end:
|
181 |
| -; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ] |
182 |
| -; CHECK-NEXT: tail call void @func(i32 [[ADD_LCSSA]]) |
| 182 | +; CHECK-NEXT: [[TMP0:%.*]] = mul i32 [[M]], 186 |
| 183 | +; CHECK-NEXT: tail call void @func(i32 [[TMP0]]) |
183 | 184 | ; CHECK-NEXT: ret void
|
184 | 185 | ;
|
185 | 186 | entry:
|
@@ -215,8 +216,8 @@ define void @test6(i32 %m, i32* %p) nounwind uwtable {
|
215 | 216 | ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 186
|
216 | 217 | ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]]
|
217 | 218 | ; CHECK: for.end:
|
218 |
| -; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ] |
219 |
| -; CHECK-NEXT: tail call void @func(i32 [[ADD_LCSSA]]) |
| 219 | +; CHECK-NEXT: [[TMP0:%.*]] = mul i32 [[M]], 186 |
| 220 | +; CHECK-NEXT: tail call void @func(i32 [[TMP0]]) |
220 | 221 | ; CHECK-NEXT: ret void
|
221 | 222 | ;
|
222 | 223 | entry:
|
|
0 commit comments