@@ -26,7 +26,7 @@ define internal i32 @test_cannot_promote_1(ptr %p, ptr nocapture readonly %test_
26
26
ret i32 %sum
27
27
}
28
28
29
- ; This is called by @caller_aliased_args , from which we can see that %test_c may
29
+ ; This is called by multiple callers , from which we can see that %test_c may
30
30
; alias %p and so we cannot promote %test_c.
31
31
;
32
32
define internal i32 @test_cannot_promote_2 (ptr %p , ptr nocapture readonly %test_c ) {
@@ -87,9 +87,8 @@ define internal i32 @test_can_promote_1(ptr %p, ptr nocapture readonly %test_c)
87
87
ret i32 %sum
88
88
}
89
89
90
- ; This is called by multiple callers (@caller_safe_args_1, @caller_safe_args_2),
91
- ; from which we can prove that %test_c does not alias %p for any Call to the
92
- ; function, so we can promote it.
90
+ ; This is called by multiple callers, from which we can prove that %test_c does
91
+ ; not alias %p for any Call to the function, so we can promote it.
93
92
;
94
93
define internal i32 @test_can_promote_2 (ptr %p , ptr nocapture readonly %test_c ) {
95
94
; CHECK-LABEL: define {{[^@]+}}@test_can_promote_2
@@ -223,4 +222,76 @@ define i32 @caller_safe_args_2(i64 %n, ptr %p) {
223
222
ret i32 %res
224
223
}
225
224
225
+ ; Invokes @test_cannot_promote_2
226
+ define i32 @caller_invoke_aliased_args () personality ptr @__gxx_personality_v0 {
227
+ ; CHECK-LABEL: define {{[^@]+}}@caller_invoke_aliased_args() personality ptr @__gxx_personality_v0 {
228
+ ; CHECK-NEXT: entry:
229
+ ; CHECK-NEXT: [[CALLER_C:%.*]] = alloca i32, align 4
230
+ ; CHECK-NEXT: store i32 5, ptr [[CALLER_C]], align 4
231
+ ; CHECK-NEXT: [[RES:%.*]] = invoke i32 @test_cannot_promote_2(ptr [[CALLER_C]], ptr [[CALLER_C]])
232
+ ; CHECK-NEXT: to label [[OUT:%.*]] unwind label [[CPAD:%.*]]
233
+ ; CHECK: out:
234
+ ; CHECK-NEXT: ret i32 [[RES]]
235
+ ; CHECK: cpad:
236
+ ; CHECK-NEXT: [[EXN:%.*]] = landingpad { ptr, i32 }
237
+ ; CHECK-NEXT: catch ptr @_ZTIi
238
+ ; CHECK-NEXT: ret i32 -1
239
+ ;
240
+ entry:
241
+ %caller_c = alloca i32
242
+ store i32 5 , ptr %caller_c
243
+
244
+ %res = invoke i32 @test_cannot_promote_2 (ptr %caller_c , ptr %caller_c )
245
+ to label %out unwind label %cpad
246
+
247
+ out:
248
+ ret i32 %res
249
+
250
+ cpad:
251
+ %exn = landingpad { ptr , i32 }
252
+ catch ptr @_ZTIi
253
+ ret i32 -1
254
+ }
255
+
256
+ ; Invokes @test_can_promote_2
257
+ define i32 @caller_invoke_safe_args (i64 %n ) personality ptr @__gxx_personality_v0 {
258
+ ; CHECK-LABEL: define {{[^@]+}}@caller_invoke_safe_args
259
+ ; CHECK-SAME: (i64 [[N:%.*]]) personality ptr @__gxx_personality_v0 {
260
+ ; CHECK-NEXT: entry:
261
+ ; CHECK-NEXT: [[P:%.*]] = alloca [5 x double], i64 [[N]], align 8
262
+ ; CHECK-NEXT: call void @memset(ptr [[P]], i64 0, i64 [[N]])
263
+ ; CHECK-NEXT: [[CALLER_C:%.*]] = alloca i32, align 4
264
+ ; CHECK-NEXT: store i32 5, ptr [[CALLER_C]], align 4
265
+ ; CHECK-NEXT: [[CALLER_C_VAL:%.*]] = load i32, ptr [[CALLER_C]], align 4
266
+ ; CHECK-NEXT: [[RES:%.*]] = invoke i32 @test_can_promote_2(ptr [[P]], i32 [[CALLER_C_VAL]])
267
+ ; CHECK-NEXT: to label [[OUT:%.*]] unwind label [[CPAD:%.*]]
268
+ ; CHECK: out:
269
+ ; CHECK-NEXT: ret i32 [[RES]]
270
+ ; CHECK: cpad:
271
+ ; CHECK-NEXT: [[EXN:%.*]] = landingpad { ptr, i32 }
272
+ ; CHECK-NEXT: catch ptr @_ZTIi
273
+ ; CHECK-NEXT: ret i32 -1
274
+ ;
275
+ entry:
276
+ %p = alloca [5 x double ], i64 %n
277
+ call void @memset (ptr %p , i64 0 , i64 %n )
278
+
279
+ %caller_c = alloca i32
280
+ store i32 5 , ptr %caller_c
281
+
282
+ %res = invoke i32 @test_can_promote_2 (ptr %p , ptr %caller_c )
283
+ to label %out unwind label %cpad
284
+
285
+ out:
286
+ ret i32 %res
287
+
288
+ cpad:
289
+ %exn = landingpad { ptr , i32 }
290
+ catch ptr @_ZTIi
291
+ ret i32 -1
292
+ }
293
+
226
294
declare void @memset (ptr , i64 , i64 )
295
+ declare i32 @__gxx_personality_v0 (...)
296
+
297
+ @_ZTIi = external constant ptr
0 commit comments