@@ -158,6 +158,58 @@ exit:
158
158
ret void
159
159
}
160
160
161
+ define void @test_captured_before_loop_address_only (i32 %len ) {
162
+ ; CHECK-LABEL: @test_captured_before_loop_address_only(
163
+ ; CHECK-NEXT: entry:
164
+ ; CHECK-NEXT: [[COUNT:%.*]] = alloca i32, align 4
165
+ ; CHECK-NEXT: store i32 0, ptr [[COUNT]], align 4
166
+ ; CHECK-NEXT: call void @capture(ptr captures(address) [[COUNT]])
167
+ ; CHECK-NEXT: [[COUNT_PROMOTED:%.*]] = load i32, ptr [[COUNT]], align 4
168
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
169
+ ; CHECK: loop:
170
+ ; CHECK-NEXT: [[C_INC2:%.*]] = phi i32 [ [[COUNT_PROMOTED]], [[ENTRY:%.*]] ], [ [[C_INC1:%.*]], [[LATCH:%.*]] ]
171
+ ; CHECK-NEXT: [[I:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[I_NEXT:%.*]], [[LATCH]] ]
172
+ ; CHECK-NEXT: [[COND:%.*]] = call i1 @cond(i32 [[I]])
173
+ ; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[LATCH]]
174
+ ; CHECK: if:
175
+ ; CHECK-NEXT: [[C_INC:%.*]] = add i32 [[C_INC2]], 1
176
+ ; CHECK-NEXT: br label [[LATCH]]
177
+ ; CHECK: latch:
178
+ ; CHECK-NEXT: [[C_INC1]] = phi i32 [ [[C_INC]], [[IF]] ], [ [[C_INC2]], [[LOOP]] ]
179
+ ; CHECK-NEXT: [[I_NEXT]] = add nuw i32 [[I]], 1
180
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[I_NEXT]], [[LEN:%.*]]
181
+ ; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
182
+ ; CHECK: exit:
183
+ ; CHECK-NEXT: [[C_INC1_LCSSA:%.*]] = phi i32 [ [[C_INC1]], [[LATCH]] ]
184
+ ; CHECK-NEXT: store i32 [[C_INC1_LCSSA]], ptr [[COUNT]], align 4
185
+ ; CHECK-NEXT: ret void
186
+ ;
187
+ entry:
188
+ %count = alloca i32
189
+ store i32 0 , ptr %count
190
+ call void @capture (ptr captures(address) %count )
191
+ br label %loop
192
+
193
+ loop:
194
+ %i = phi i32 [ 0 , %entry ], [ %i.next , %latch ]
195
+ %cond = call i1 @cond (i32 %i )
196
+ br i1 %cond , label %if , label %latch
197
+
198
+ if:
199
+ %c = load i32 , ptr %count
200
+ %c.inc = add i32 %c , 1
201
+ store i32 %c.inc , ptr %count
202
+ br label %latch
203
+
204
+ latch:
205
+ %i.next = add nuw i32 %i , 1
206
+ %cmp = icmp eq i32 %i.next , %len
207
+ br i1 %cmp , label %exit , label %loop
208
+
209
+ exit:
210
+ ret void
211
+ }
212
+
161
213
; Should not get promoted, because the pointer is captured and may not
162
214
; be thread-local.
163
215
define void @test_captured_before_loop_byval (ptr byval (i32 ) align 4 %count , i32 %len ) {
0 commit comments