@@ -1232,7 +1232,7 @@ if.end:
12321232}
12331233
12341234; 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 {
12361236; CHECK-LABEL: @t21_semicompatible_operand_bundle(
12371237; CHECK-NEXT: entry:
12381238; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
@@ -1246,7 +1246,7 @@ define void @t21_semicompatible_operand_bundle() personality ptr @__gxx_personal
12461246; CHECK-NEXT: [[C1:%.*]] = call i1 @cond()
12471247; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1_INVOKE]], label [[IF_END:%.*]]
12481248; 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:%.*]] ]
12501250; CHECK-NEXT: invoke void @simple_throw() [ "abc"(i32 [[TMP0]]) ]
12511251; CHECK-NEXT: to label [[IF_THEN1_CONT:%.*]] unwind label [[LPAD:%.*]]
12521252; CHECK: if.then1.cont:
@@ -1260,7 +1260,7 @@ entry:
12601260 br i1 %c0 , label %if.then0 , label %if.else
12611261
12621262if.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
12641264
12651265invoke .cont0:
12661266 unreachable
@@ -1275,7 +1275,7 @@ if.else:
12751275 br i1 %c1 , label %if.then1 , label %if.end
12761276
12771277if.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
12791279
12801280invoke .cont2:
12811281 unreachable
@@ -2342,7 +2342,7 @@ if.end:
23422342}
23432343
23442344; 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 {
23462346; CHECK-LABEL: @t39_different_arguments_and_operand_bundes_are_fine(
23472347; CHECK-NEXT: entry:
23482348; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
@@ -2356,7 +2356,7 @@ define void @t39_different_arguments_and_operand_bundes_are_fine(ptr %callee0, p
23562356; CHECK-NEXT: [[C1:%.*]] = call i1 @cond()
23572357; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1_INVOKE]], label [[IF_END:%.*]]
23582358; 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:%.*]] ]
23602360; CHECK-NEXT: [[TMP1:%.*]] = phi ptr [ [[CALLEE1:%.*]], [[IF_ELSE]] ], [ [[CALLEE0:%.*]], [[ENTRY]] ]
23612361; CHECK-NEXT: invoke void [[TMP1]]() [ "abc"(i32 [[TMP0]]) ]
23622362; CHECK-NEXT: to label [[IF_THEN1_CONT:%.*]] unwind label [[LPAD:%.*]]
@@ -2371,7 +2371,7 @@ entry:
23712371 br i1 %c0 , label %if.then0 , label %if.else
23722372
23732373if.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
23752375
23762376invoke .cont0:
23772377 unreachable
@@ -2386,7 +2386,7 @@ if.else:
23862386 br i1 %c1 , label %if.then1 , label %if.end
23872387
23882388if.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
23902390
23912391invoke .cont2:
23922392 unreachable
@@ -2397,7 +2397,7 @@ if.end:
23972397}
23982398
23992399; 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 {
24012401; CHECK-LABEL: @t40_different_arguments_and_operand_bundes_are_fine(
24022402; CHECK-NEXT: entry:
24032403; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
@@ -2412,7 +2412,7 @@ define void @t40_different_arguments_and_operand_bundes_are_fine(ptr %callee0, p
24122412; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1_INVOKE]], label [[IF_END:%.*]]
24132413; CHECK: if.then1.invoke:
24142414; 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]] ]
24162416; CHECK-NEXT: [[TMP2:%.*]] = phi ptr [ [[CALLEE1:%.*]], [[IF_ELSE]] ], [ [[CALLEE0:%.*]], [[ENTRY]] ]
24172417; CHECK-NEXT: invoke void [[TMP2]](i32 [[TMP0]]) [ "abc"(i32 [[TMP1]]) ]
24182418; CHECK-NEXT: to label [[IF_THEN1_CONT:%.*]] unwind label [[LPAD:%.*]]
@@ -2427,7 +2427,7 @@ entry:
24272427 br i1 %c0 , label %if.then0 , label %if.else
24282428
24292429if.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
24312431
24322432invoke .cont0:
24332433 unreachable
@@ -2442,7 +2442,7 @@ if.else:
24422442 br i1 %c1 , label %if.then1 , label %if.end
24432443
24442444if.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
24462446
24472447invoke .cont2:
24482448 unreachable
@@ -2452,6 +2452,43 @@ if.end:
24522452 ret void
24532453}
24542454
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+
24552492declare i1 @cond ()
24562493
24572494declare void @sideeffect ()
0 commit comments