@@ -1232,7 +1232,7 @@ if.end:
1232
1232
}
1233
1233
1234
1234
; We need to PHI together the arguments of the operand bundles.
1235
- define void @t21_semicompatible_operand_bundle () personality ptr @__gxx_personality_v0 {
1235
+ define void @t21_semicompatible_operand_bundle (i32 %a , i32 %b ) personality ptr @__gxx_personality_v0 {
1236
1236
; CHECK-LABEL: @t21_semicompatible_operand_bundle(
1237
1237
; CHECK-NEXT: entry:
1238
1238
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
@@ -1246,7 +1246,7 @@ define void @t21_semicompatible_operand_bundle() personality ptr @__gxx_personal
1246
1246
; CHECK-NEXT: [[C1:%.*]] = call i1 @cond()
1247
1247
; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1_INVOKE]], label [[IF_END:%.*]]
1248
1248
; CHECK: if.then1.invoke:
1249
- ; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ 0 , [[IF_ELSE]] ], [ 42 , [[ENTRY:%.*]] ]
1249
+ ; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ [[B:%.*]] , [[IF_ELSE]] ], [ [[A:%.*]] , [[ENTRY:%.*]] ]
1250
1250
; CHECK-NEXT: invoke void @simple_throw() [ "abc"(i32 [[TMP0]]) ]
1251
1251
; CHECK-NEXT: to label [[IF_THEN1_CONT:%.*]] unwind label [[LPAD:%.*]]
1252
1252
; CHECK: if.then1.cont:
@@ -1260,7 +1260,7 @@ entry:
1260
1260
br i1 %c0 , label %if.then0 , label %if.else
1261
1261
1262
1262
if.then0:
1263
- invoke void @simple_throw () [ "abc" (i32 42 ) ] to label %invoke.cont0 unwind label %lpad
1263
+ invoke void @simple_throw () [ "abc" (i32 %a ) ] to label %invoke.cont0 unwind label %lpad
1264
1264
1265
1265
invoke .cont0:
1266
1266
unreachable
@@ -1275,7 +1275,7 @@ if.else:
1275
1275
br i1 %c1 , label %if.then1 , label %if.end
1276
1276
1277
1277
if.then1:
1278
- invoke void @simple_throw () [ "abc" (i32 0 ) ] to label %invoke.cont2 unwind label %lpad
1278
+ invoke void @simple_throw () [ "abc" (i32 %b ) ] to label %invoke.cont2 unwind label %lpad
1279
1279
1280
1280
invoke .cont2:
1281
1281
unreachable
@@ -2342,7 +2342,7 @@ if.end:
2342
2342
}
2343
2343
2344
2344
; For indirect invokes, different operand bundle arguments are fine.
2345
- define void @t39_different_arguments_and_operand_bundes_are_fine (ptr %callee0 , ptr %callee1 ) personality ptr @__gxx_personality_v0 {
2345
+ define void @t39_different_arguments_and_operand_bundes_are_fine (ptr %callee0 , ptr %callee1 , i32 %a , i32 %b ) personality ptr @__gxx_personality_v0 {
2346
2346
; CHECK-LABEL: @t39_different_arguments_and_operand_bundes_are_fine(
2347
2347
; CHECK-NEXT: entry:
2348
2348
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
@@ -2356,7 +2356,7 @@ define void @t39_different_arguments_and_operand_bundes_are_fine(ptr %callee0, p
2356
2356
; CHECK-NEXT: [[C1:%.*]] = call i1 @cond()
2357
2357
; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1_INVOKE]], label [[IF_END:%.*]]
2358
2358
; CHECK: if.then1.invoke:
2359
- ; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ 0 , [[IF_ELSE]] ], [ 42 , [[ENTRY:%.*]] ]
2359
+ ; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ [[B:%.*]] , [[IF_ELSE]] ], [ [[A:%.*]] , [[ENTRY:%.*]] ]
2360
2360
; CHECK-NEXT: [[TMP1:%.*]] = phi ptr [ [[CALLEE1:%.*]], [[IF_ELSE]] ], [ [[CALLEE0:%.*]], [[ENTRY]] ]
2361
2361
; CHECK-NEXT: invoke void [[TMP1]]() [ "abc"(i32 [[TMP0]]) ]
2362
2362
; CHECK-NEXT: to label [[IF_THEN1_CONT:%.*]] unwind label [[LPAD:%.*]]
@@ -2371,7 +2371,7 @@ entry:
2371
2371
br i1 %c0 , label %if.then0 , label %if.else
2372
2372
2373
2373
if.then0:
2374
- invoke void %callee0 () [ "abc" (i32 42 ) ] to label %invoke.cont0 unwind label %lpad
2374
+ invoke void %callee0 () [ "abc" (i32 %a ) ] to label %invoke.cont0 unwind label %lpad
2375
2375
2376
2376
invoke .cont0:
2377
2377
unreachable
@@ -2386,7 +2386,7 @@ if.else:
2386
2386
br i1 %c1 , label %if.then1 , label %if.end
2387
2387
2388
2388
if.then1:
2389
- invoke void %callee1 () [ "abc" (i32 0 ) ] to label %invoke.cont2 unwind label %lpad
2389
+ invoke void %callee1 () [ "abc" (i32 %b ) ] to label %invoke.cont2 unwind label %lpad
2390
2390
2391
2391
invoke .cont2:
2392
2392
unreachable
@@ -2397,7 +2397,7 @@ if.end:
2397
2397
}
2398
2398
2399
2399
; For indirect invokes, both different arguments and operand bundle arguments are fine.
2400
- define void @t40_different_arguments_and_operand_bundes_are_fine (ptr %callee0 , ptr %callee1 ) personality ptr @__gxx_personality_v0 {
2400
+ define void @t40_different_arguments_and_operand_bundes_are_fine (ptr %callee0 , ptr %callee1 , i32 %a , i32 %b ) personality ptr @__gxx_personality_v0 {
2401
2401
; CHECK-LABEL: @t40_different_arguments_and_operand_bundes_are_fine(
2402
2402
; CHECK-NEXT: entry:
2403
2403
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
@@ -2412,7 +2412,7 @@ define void @t40_different_arguments_and_operand_bundes_are_fine(ptr %callee0, p
2412
2412
; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1_INVOKE]], label [[IF_END:%.*]]
2413
2413
; CHECK: if.then1.invoke:
2414
2414
; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ 42, [[IF_ELSE]] ], [ 0, [[ENTRY:%.*]] ]
2415
- ; CHECK-NEXT: [[TMP1:%.*]] = phi i32 [ 0 , [[IF_ELSE]] ], [ 42 , [[ENTRY]] ]
2415
+ ; CHECK-NEXT: [[TMP1:%.*]] = phi i32 [ [[B:%.*]] , [[IF_ELSE]] ], [ [[A:%.*]] , [[ENTRY]] ]
2416
2416
; CHECK-NEXT: [[TMP2:%.*]] = phi ptr [ [[CALLEE1:%.*]], [[IF_ELSE]] ], [ [[CALLEE0:%.*]], [[ENTRY]] ]
2417
2417
; CHECK-NEXT: invoke void [[TMP2]](i32 [[TMP0]]) [ "abc"(i32 [[TMP1]]) ]
2418
2418
; CHECK-NEXT: to label [[IF_THEN1_CONT:%.*]] unwind label [[LPAD:%.*]]
@@ -2427,7 +2427,7 @@ entry:
2427
2427
br i1 %c0 , label %if.then0 , label %if.else
2428
2428
2429
2429
if.then0:
2430
- invoke void %callee0 (i32 0 ) [ "abc" (i32 42 ) ] to label %invoke.cont0 unwind label %lpad
2430
+ invoke void %callee0 (i32 0 ) [ "abc" (i32 %a ) ] to label %invoke.cont0 unwind label %lpad
2431
2431
2432
2432
invoke .cont0:
2433
2433
unreachable
@@ -2442,7 +2442,7 @@ if.else:
2442
2442
br i1 %c1 , label %if.then1 , label %if.end
2443
2443
2444
2444
if.then1:
2445
- invoke void %callee1 (i32 42 ) [ "abc" (i32 0 ) ] to label %invoke.cont2 unwind label %lpad
2445
+ invoke void %callee1 (i32 42 ) [ "abc" (i32 %b ) ] to label %invoke.cont2 unwind label %lpad
2446
2446
2447
2447
invoke .cont2:
2448
2448
unreachable
@@ -2452,6 +2452,43 @@ if.end:
2452
2452
ret void
2453
2453
}
2454
2454
2455
+ define void @dont_merge_different_immargs (i1 %c1 ) gc "statepoint-example" personality ptr null {
2456
+ ; CHECK-LABEL: @dont_merge_different_immargs(
2457
+ ; CHECK-NEXT: br i1 [[C1:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
2458
+ ; CHECK: if:
2459
+ ; CHECK-NEXT: [[T1:%.*]] = invoke token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 1, i32 0, ptr elementtype(void (ptr addrspace(1))) null, i32 1, i32 0, ptr addrspace(1) null, i64 0, i64 0)
2460
+ ; CHECK-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[LPAD:%.*]]
2461
+ ; CHECK: else:
2462
+ ; CHECK-NEXT: [[T2:%.*]] = invoke token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(void (ptr addrspace(1))) null, i32 1, i32 0, ptr addrspace(1) null, i64 0, i64 0)
2463
+ ; CHECK-NEXT: to label [[UNREACHABLE]] unwind label [[LPAD]]
2464
+ ; CHECK: unreachable:
2465
+ ; CHECK-NEXT: unreachable
2466
+ ; CHECK: lpad:
2467
+ ; CHECK-NEXT: [[T3:%.*]] = landingpad token
2468
+ ; CHECK-NEXT: cleanup
2469
+ ; CHECK-NEXT: ret void
2470
+ ;
2471
+ br i1 %c1 , label %if , label %else
2472
+
2473
+ if:
2474
+ %t1 = invoke token (i64 , i32 , ptr , i32 , i32 , ...) @llvm.experimental.gc.statepoint.p0 (i64 1 , i32 0 , ptr elementtype(void (ptr addrspace (1 ))) null , i32 1 , i32 0 , ptr addrspace (1 ) null , i64 0 , i64 0 )
2475
+ to label %unreachable unwind label %lpad
2476
+
2477
+ else:
2478
+ %t2 = invoke token (i64 , i32 , ptr , i32 , i32 , ...) @llvm.experimental.gc.statepoint.p0 (i64 0 , i32 0 , ptr elementtype(void (ptr addrspace (1 ))) null , i32 1 , i32 0 , ptr addrspace (1 ) null , i64 0 , i64 0 )
2479
+ to label %unreachable unwind label %lpad
2480
+
2481
+ unreachable:
2482
+ unreachable
2483
+
2484
+ lpad:
2485
+ %t3 = landingpad token
2486
+ cleanup
2487
+ ret void
2488
+ }
2489
+
2490
+ declare token @llvm.experimental.gc.statepoint.p0 (i64 immarg, i32 immarg, ptr , i32 immarg, i32 immarg, ...)
2491
+
2455
2492
declare i1 @cond ()
2456
2493
2457
2494
declare void @sideeffect ()
0 commit comments