1
+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
1
2
; RUN: opt < %s -indvars -S | FileCheck %s
2
3
3
4
; This tests that the IV is not recomputed outside of the loop when it is known
21
22
22
23
declare void @func (i32 )
23
24
24
- ; CHECK-LABEL: @test(
25
25
define void @test (i32 %m ) nounwind uwtable {
26
+ ; CHECK-LABEL: @test(
27
+ ; CHECK-NEXT: entry:
28
+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
29
+ ; CHECK: for.body:
30
+ ; CHECK-NEXT: [[I_06:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
31
+ ; CHECK-NEXT: [[A_05:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[ADD:%.*]], [[FOR_BODY]] ]
32
+ ; CHECK-NEXT: [[ADD]] = add i32 [[A_05]], [[M:%.*]]
33
+ ; CHECK-NEXT: tail call void @func(i32 [[ADD]])
34
+ ; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_06]], 1
35
+ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 186
36
+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]]
37
+ ; CHECK: for.end:
38
+ ; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ]
39
+ ; CHECK-NEXT: tail call void @func(i32 [[ADD_LCSSA]])
40
+ ; CHECK-NEXT: ret void
41
+ ;
26
42
entry:
27
43
br label %for.body
28
44
29
45
for.body: ; preds = %for.body, %entry
30
46
%i.06 = phi i32 [ 0 , %entry ], [ %inc , %for.body ]
31
47
%a.05 = phi i32 [ 0 , %entry ], [ %add , %for.body ]
32
48
%add = add i32 %a.05 , %m
33
- ; CHECK: tail call void @func(i32 %add)
34
49
tail call void @func (i32 %add )
35
50
%inc = add nsw i32 %i.06 , 1
36
51
%exitcond = icmp eq i32 %inc , 186
37
52
br i1 %exitcond , label %for.end , label %for.body
38
53
39
54
for.end: ; preds = %for.body
40
- ; CHECK: for.end:
41
- ; CHECK-NOT: mul i32 %m, 186
42
- ; CHECK:%add.lcssa = phi i32 [ %add, %for.body ]
43
- ; CHECK-NEXT: tail call void @func(i32 %add.lcssa)
44
55
tail call void @func (i32 %add )
45
56
ret void
46
57
}
47
58
48
- ; CHECK-LABEL: @test2(
49
59
define i32 @test2 (i32 %m ) nounwind uwtable {
60
+ ; CHECK-LABEL: @test2(
61
+ ; CHECK-NEXT: entry:
62
+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
63
+ ; CHECK: for.body:
64
+ ; CHECK-NEXT: [[I_06:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
65
+ ; CHECK-NEXT: [[A_05:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[ADD:%.*]], [[FOR_BODY]] ]
66
+ ; CHECK-NEXT: [[ADD]] = add i32 [[A_05]], [[M:%.*]]
67
+ ; CHECK-NEXT: tail call void @func(i32 [[ADD]])
68
+ ; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_06]], 1
69
+ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 186
70
+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]]
71
+ ; CHECK: for.end:
72
+ ; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ]
73
+ ; CHECK-NEXT: ret i32 [[ADD_LCSSA]]
74
+ ;
50
75
entry:
51
76
br label %for.body
52
77
53
78
for.body: ; preds = %for.body, %entry
54
79
%i.06 = phi i32 [ 0 , %entry ], [ %inc , %for.body ]
55
80
%a.05 = phi i32 [ 0 , %entry ], [ %add , %for.body ]
56
81
%add = add i32 %a.05 , %m
57
- ; CHECK: tail call void @func(i32 %add)
58
82
tail call void @func (i32 %add )
59
83
%inc = add nsw i32 %i.06 , 1
60
84
%exitcond = icmp eq i32 %inc , 186
61
85
br i1 %exitcond , label %for.end , label %for.body
62
86
63
87
for.end: ; preds = %for.body
64
- ; CHECK: for.end:
65
- ; CHECK-NOT: mul i32 %m, 186
66
- ; CHECK:%add.lcssa = phi i32 [ %add, %for.body ]
67
- ; CHECK-NEXT: ret i32 %add.lcssa
68
88
ret i32 %add
69
89
}
70
90
71
- ; CHECK-LABEL: @test3(
72
91
define void @test3 (i32 %m ) nounwind uwtable {
92
+ ; CHECK-LABEL: @test3(
93
+ ; CHECK-NEXT: entry:
94
+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
95
+ ; CHECK: for.body:
96
+ ; CHECK-NEXT: [[I_06:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
97
+ ; CHECK-NEXT: [[A_05:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[ADD:%.*]], [[FOR_BODY]] ]
98
+ ; CHECK-NEXT: [[ADD]] = add i32 [[A_05]], [[M:%.*]]
99
+ ; CHECK-NEXT: tail call void @func(i32 [[ADD]])
100
+ ; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_06]], 1
101
+ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 186
102
+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]]
103
+ ; CHECK: for.end:
104
+ ; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ]
105
+ ; CHECK-NEXT: tail call void @func(i32 [[ADD_LCSSA]])
106
+ ; CHECK-NEXT: ret void
107
+ ;
73
108
entry:
74
109
br label %for.body
75
110
@@ -83,49 +118,70 @@ for.body: ; preds = %for.body, %entry
83
118
mul i32 %add , 1
84
119
mul i32 %add , 1
85
120
mul i32 %add , 1
86
- ; CHECK: tail call void @func(i32 %add)
87
121
tail call void @func (i32 %add )
88
122
%inc = add nsw i32 %i.06 , 1
89
123
%exitcond = icmp eq i32 %inc , 186
90
124
br i1 %exitcond , label %for.end , label %for.body
91
125
92
126
for.end: ; preds = %for.body
93
- ; CHECK: for.end:
94
- ; CHECK-NOT: mul i32 %m, 186
95
- ; CHECK:%add.lcssa = phi i32 [ %add, %for.body ]
96
- ; CHECK-NEXT: tail call void @func(i32 %add.lcssa)
97
127
tail call void @func (i32 %add )
98
128
ret void
99
129
}
100
130
101
- ; CHECK-LABEL: @test4(
102
131
define void @test4 (i32 %m ) nounwind uwtable {
132
+ ; CHECK-LABEL: @test4(
133
+ ; CHECK-NEXT: entry:
134
+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
135
+ ; CHECK: for.body:
136
+ ; CHECK-NEXT: [[I_06:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
137
+ ; CHECK-NEXT: [[A_05:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[ADD:%.*]], [[FOR_BODY]] ]
138
+ ; CHECK-NEXT: [[ADD]] = add i32 [[A_05]], [[M:%.*]]
139
+ ; CHECK-NEXT: tail call void @func(i32 [[ADD]])
140
+ ; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_06]], 1
141
+ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 186
142
+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]]
143
+ ; CHECK: for.end:
144
+ ; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ]
145
+ ; CHECK-NEXT: [[SOFT_USE:%.*]] = add i32 [[ADD_LCSSA]], 123
146
+ ; CHECK-NEXT: tail call void @func(i32 [[SOFT_USE]])
147
+ ; CHECK-NEXT: ret void
148
+ ;
103
149
entry:
104
150
br label %for.body
105
151
106
152
for.body: ; preds = %for.body, %entry
107
153
%i.06 = phi i32 [ 0 , %entry ], [ %inc , %for.body ]
108
154
%a.05 = phi i32 [ 0 , %entry ], [ %add , %for.body ]
109
155
%add = add i32 %a.05 , %m
110
- ; CHECK: tail call void @func(i32 %add)
111
156
tail call void @func (i32 %add )
112
157
%inc = add nsw i32 %i.06 , 1
113
158
%exitcond = icmp eq i32 %inc , 186
114
159
br i1 %exitcond , label %for.end , label %for.body
115
160
116
161
for.end: ; preds = %for.body
117
- ; CHECK: for.end:
118
- ; CHECK-NOT: mul i32 %m, 186
119
- ; CHECK:%add.lcssa = phi i32 [ %add, %for.body ]
120
- ; CHECK-NEXT: %soft_use = add i32 %add.lcssa, 123
121
- ; CHECK-NEXT: tail call void @func(i32 %soft_use)
122
162
%soft_use = add i32 %add , 123
123
163
tail call void @func (i32 %soft_use )
124
164
ret void
125
165
}
126
166
127
- ; CHECK-LABEL: @test5(
128
167
define void @test5 (i32 %m ) nounwind uwtable {
168
+ ; CHECK-LABEL: @test5(
169
+ ; CHECK-NEXT: entry:
170
+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
171
+ ; CHECK: for.body:
172
+ ; CHECK-NEXT: [[I_06:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
173
+ ; CHECK-NEXT: [[A_05:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[ADD:%.*]], [[FOR_BODY]] ]
174
+ ; CHECK-NEXT: [[ADD]] = add i32 [[A_05]], [[M:%.*]]
175
+ ; CHECK-NEXT: [[SOFT_USE:%.*]] = add i32 [[ADD]], 123
176
+ ; CHECK-NEXT: tail call void @func(i32 [[SOFT_USE]])
177
+ ; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_06]], 1
178
+ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 186
179
+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]]
180
+ ; CHECK: for.end:
181
+ ; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ]
182
+ ; CHECK-NEXT: tail call void @func(i32 [[ADD_LCSSA]])
183
+ ; CHECK-NEXT: ret void
184
+ ;
129
185
entry:
130
186
br label %for.body
131
187
@@ -134,23 +190,35 @@ for.body: ; preds = %for.body, %entry
134
190
%a.05 = phi i32 [ 0 , %entry ], [ %add , %for.body ]
135
191
%add = add i32 %a.05 , %m
136
192
%soft_use = add i32 %add , 123
137
- ; CHECK: tail call void @func(i32 %soft_use)
138
193
tail call void @func (i32 %soft_use )
139
194
%inc = add nsw i32 %i.06 , 1
140
195
%exitcond = icmp eq i32 %inc , 186
141
196
br i1 %exitcond , label %for.end , label %for.body
142
197
143
198
for.end: ; preds = %for.body
144
- ; CHECK: for.end:
145
- ; CHECK-NOT: mul i32 %m, 186
146
- ; CHECK:%add.lcssa = phi i32 [ %add, %for.body ]
147
- ; CHECK-NEXT: tail call void @func(i32 %add.lcssa)
148
199
tail call void @func (i32 %add )
149
200
ret void
150
201
}
151
202
152
- ; CHECK-LABEL: @test6(
153
203
define void @test6 (i32 %m , i32* %p ) nounwind uwtable {
204
+ ; CHECK-LABEL: @test6(
205
+ ; CHECK-NEXT: entry:
206
+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
207
+ ; CHECK: for.body:
208
+ ; CHECK-NEXT: [[I_06:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
209
+ ; CHECK-NEXT: [[A_05:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[ADD:%.*]], [[FOR_BODY]] ]
210
+ ; CHECK-NEXT: [[ADD]] = add i32 [[A_05]], [[M:%.*]]
211
+ ; CHECK-NEXT: [[SOFT_USE:%.*]] = add i32 [[ADD]], 123
212
+ ; CHECK-NEXT: [[PIDX:%.*]] = getelementptr i32, i32* [[P:%.*]], i32 [[ADD]]
213
+ ; CHECK-NEXT: store i32 [[SOFT_USE]], i32* [[PIDX]]
214
+ ; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_06]], 1
215
+ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], 186
216
+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]]
217
+ ; CHECK: for.end:
218
+ ; CHECK-NEXT: [[ADD_LCSSA:%.*]] = phi i32 [ [[ADD]], [[FOR_BODY]] ]
219
+ ; CHECK-NEXT: tail call void @func(i32 [[ADD_LCSSA]])
220
+ ; CHECK-NEXT: ret void
221
+ ;
154
222
entry:
155
223
br label %for.body
156
224
@@ -159,18 +227,13 @@ for.body: ; preds = %for.body, %entry
159
227
%a.05 = phi i32 [ 0 , %entry ], [ %add , %for.body ]
160
228
%add = add i32 %a.05 , %m
161
229
%soft_use = add i32 %add , 123
162
- ; CHECK: store i32 %soft_use, i32* %pidx
163
230
%pidx = getelementptr i32 , i32* %p , i32 %add
164
231
store i32 %soft_use , i32* %pidx
165
232
%inc = add nsw i32 %i.06 , 1
166
233
%exitcond = icmp eq i32 %inc , 186
167
234
br i1 %exitcond , label %for.end , label %for.body
168
235
169
236
for.end: ; preds = %for.body
170
- ; CHECK: for.end:
171
- ; CHECK-NOT: mul i32 %m, 186
172
- ; CHECK:%add.lcssa = phi i32 [ %add, %for.body ]
173
- ; CHECK-NEXT: tail call void @func(i32 %add.lcssa)
174
237
tail call void @func (i32 %add )
175
238
ret void
176
239
}
0 commit comments