Skip to content

Commit b7382b9

Browse files
goldsteinnDanielCChen
authored andcommitted
[SimplifyCFG] Allow merging invoke's with different attrs
Same logic as other callsites, if the attributes are intersectable, we merge. Closes llvm#111713
1 parent e261696 commit b7382b9

File tree

2 files changed

+27
-39
lines changed

2 files changed

+27
-39
lines changed

llvm/lib/Transforms/Utils/SimplifyCFG.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2779,7 +2779,7 @@ bool CompatibleSets::shouldBelongToSameSet(ArrayRef<InvokeInst *> Invokes) {
27792779
// including operand bundles.
27802780
const InvokeInst *II0 = Invokes.front();
27812781
for (auto *II : Invokes.drop_front())
2782-
if (!II->isSameOperationAs(II0))
2782+
if (!II->isSameOperationAs(II0, Instruction::CompareUsingIntersectedAttrs))
27832783
return false;
27842784

27852785
// Can we theoretically form the data operands for the merged `invoke`?
@@ -2918,6 +2918,10 @@ static void mergeCompatibleInvokesImpl(ArrayRef<InvokeInst *> Invokes,
29182918
for (BasicBlock *OrigSuccBB : successors(II->getParent()))
29192919
OrigSuccBB->removePredecessor(II->getParent());
29202920
BranchInst::Create(MergedInvoke->getParent(), II->getParent());
2921+
bool Success = MergedInvoke->tryIntersectAttributes(II);
2922+
assert(Success && "Merged invokes with incompatible attributes");
2923+
// For NDEBUG Compile
2924+
(void)Success;
29212925
II->replaceAllUsesWith(MergedInvoke);
29222926
II->eraseFromParent();
29232927
++NumInvokesMerged;

llvm/test/Transforms/SimplifyCFG/X86/merge-compatible-invokes-of-landingpad.ll

Lines changed: 22 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,24 +1013,19 @@ define void @t17_mismatched_attrs_okay_merge() personality ptr @__gxx_personalit
10131013
; CHECK-LABEL: define void @t17_mismatched_attrs_okay_merge() personality ptr @__gxx_personality_v0 {
10141014
; CHECK-NEXT: [[ENTRY:.*:]]
10151015
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
1016-
; CHECK-NEXT: br i1 [[C0]], label %[[IF_THEN0:.*]], label %[[IF_ELSE:.*]]
1017-
; CHECK: [[IF_THEN0]]:
1018-
; CHECK-NEXT: invoke void @simple_throw() #[[ATTR2:[0-9]+]]
1019-
; CHECK-NEXT: to label %[[INVOKE_CONT0:.*]] unwind label %[[LPAD:.*]]
1020-
; CHECK: [[INVOKE_CONT0]]:
1021-
; CHECK-NEXT: unreachable
1022-
; CHECK: [[LPAD]]:
1016+
; CHECK-NEXT: br i1 [[C0]], label %[[IF_THEN1_INVOKE:.*]], label %[[IF_ELSE:.*]]
1017+
; CHECK: [[LPAD:.*]]:
10231018
; CHECK-NEXT: [[EH:%.*]] = landingpad { ptr, i32 }
10241019
; CHECK-NEXT: cleanup
10251020
; CHECK-NEXT: call void @destructor()
10261021
; CHECK-NEXT: resume { ptr, i32 } [[EH]]
10271022
; CHECK: [[IF_ELSE]]:
10281023
; CHECK-NEXT: [[C1:%.*]] = call i1 @cond()
1029-
; CHECK-NEXT: br i1 [[C1]], label %[[IF_THEN1:.*]], label %[[IF_END:.*]]
1030-
; CHECK: [[IF_THEN1]]:
1024+
; CHECK-NEXT: br i1 [[C1]], label %[[IF_THEN1_INVOKE]], label %[[IF_END:.*]]
1025+
; CHECK: [[IF_THEN1_INVOKE]]:
10311026
; CHECK-NEXT: invoke void @simple_throw()
1032-
; CHECK-NEXT: to label %[[INVOKE_CONT2:.*]] unwind label %[[LPAD]]
1033-
; CHECK: [[INVOKE_CONT2]]:
1027+
; CHECK-NEXT: to label %[[IF_THEN1_CONT:.*]] unwind label %[[LPAD]]
1028+
; CHECK: [[IF_THEN1_CONT]]:
10341029
; CHECK-NEXT: unreachable
10351030
; CHECK: [[IF_END]]:
10361031
; CHECK-NEXT: call void @sideeffect()
@@ -1070,24 +1065,19 @@ define void @t17_mismatched_attrs_okay_merge_intersect() personality ptr @__gxx_
10701065
; CHECK-LABEL: define void @t17_mismatched_attrs_okay_merge_intersect() personality ptr @__gxx_personality_v0 {
10711066
; CHECK-NEXT: [[ENTRY:.*:]]
10721067
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
1073-
; CHECK-NEXT: br i1 [[C0]], label %[[IF_THEN0:.*]], label %[[IF_ELSE:.*]]
1074-
; CHECK: [[IF_THEN0]]:
1075-
; CHECK-NEXT: invoke void @simple_throw() #[[ATTR3:[0-9]+]]
1076-
; CHECK-NEXT: to label %[[INVOKE_CONT0:.*]] unwind label %[[LPAD:.*]]
1077-
; CHECK: [[INVOKE_CONT0]]:
1078-
; CHECK-NEXT: unreachable
1079-
; CHECK: [[LPAD]]:
1068+
; CHECK-NEXT: br i1 [[C0]], label %[[IF_THEN1_INVOKE:.*]], label %[[IF_ELSE:.*]]
1069+
; CHECK: [[LPAD:.*]]:
10801070
; CHECK-NEXT: [[EH:%.*]] = landingpad { ptr, i32 }
10811071
; CHECK-NEXT: cleanup
10821072
; CHECK-NEXT: call void @destructor()
10831073
; CHECK-NEXT: resume { ptr, i32 } [[EH]]
10841074
; CHECK: [[IF_ELSE]]:
10851075
; CHECK-NEXT: [[C1:%.*]] = call i1 @cond()
1086-
; CHECK-NEXT: br i1 [[C1]], label %[[IF_THEN1:.*]], label %[[IF_END:.*]]
1087-
; CHECK: [[IF_THEN1]]:
1088-
; CHECK-NEXT: invoke void @simple_throw() #[[ATTR2]]
1089-
; CHECK-NEXT: to label %[[INVOKE_CONT2:.*]] unwind label %[[LPAD]]
1090-
; CHECK: [[INVOKE_CONT2]]:
1076+
; CHECK-NEXT: br i1 [[C1]], label %[[IF_THEN1_INVOKE]], label %[[IF_END:.*]]
1077+
; CHECK: [[IF_THEN1_INVOKE]]:
1078+
; CHECK-NEXT: invoke void @simple_throw() #[[ATTR2:[0-9]+]]
1079+
; CHECK-NEXT: to label %[[IF_THEN1_CONT:.*]] unwind label %[[LPAD]]
1080+
; CHECK: [[IF_THEN1_CONT]]:
10911081
; CHECK-NEXT: unreachable
10921082
; CHECK: [[IF_END]]:
10931083
; CHECK-NEXT: call void @sideeffect()
@@ -1127,24 +1117,19 @@ define void @t17_mismatched_attrs_okay_merge_intersect2() personality ptr @__gxx
11271117
; CHECK-LABEL: define void @t17_mismatched_attrs_okay_merge_intersect2() personality ptr @__gxx_personality_v0 {
11281118
; CHECK-NEXT: [[ENTRY:.*:]]
11291119
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
1130-
; CHECK-NEXT: br i1 [[C0]], label %[[IF_THEN0:.*]], label %[[IF_ELSE:.*]]
1131-
; CHECK: [[IF_THEN0]]:
1132-
; CHECK-NEXT: invoke void @simple_throw() #[[ATTR2]]
1133-
; CHECK-NEXT: to label %[[INVOKE_CONT0:.*]] unwind label %[[LPAD:.*]]
1134-
; CHECK: [[INVOKE_CONT0]]:
1135-
; CHECK-NEXT: unreachable
1136-
; CHECK: [[LPAD]]:
1120+
; CHECK-NEXT: br i1 [[C0]], label %[[IF_THEN1_INVOKE:.*]], label %[[IF_ELSE:.*]]
1121+
; CHECK: [[LPAD:.*]]:
11371122
; CHECK-NEXT: [[EH:%.*]] = landingpad { ptr, i32 }
11381123
; CHECK-NEXT: cleanup
11391124
; CHECK-NEXT: call void @destructor()
11401125
; CHECK-NEXT: resume { ptr, i32 } [[EH]]
11411126
; CHECK: [[IF_ELSE]]:
11421127
; CHECK-NEXT: [[C1:%.*]] = call i1 @cond()
1143-
; CHECK-NEXT: br i1 [[C1]], label %[[IF_THEN1:.*]], label %[[IF_END:.*]]
1144-
; CHECK: [[IF_THEN1]]:
1145-
; CHECK-NEXT: invoke void @simple_throw() #[[ATTR3]]
1146-
; CHECK-NEXT: to label %[[INVOKE_CONT2:.*]] unwind label %[[LPAD]]
1147-
; CHECK: [[INVOKE_CONT2]]:
1128+
; CHECK-NEXT: br i1 [[C1]], label %[[IF_THEN1_INVOKE]], label %[[IF_END:.*]]
1129+
; CHECK: [[IF_THEN1_INVOKE]]:
1130+
; CHECK-NEXT: invoke void @simple_throw() #[[ATTR2]]
1131+
; CHECK-NEXT: to label %[[IF_THEN1_CONT:.*]] unwind label %[[LPAD]]
1132+
; CHECK: [[IF_THEN1_CONT]]:
11481133
; CHECK-NEXT: unreachable
11491134
; CHECK: [[IF_END]]:
11501135
; CHECK-NEXT: call void @sideeffect()
@@ -1187,7 +1172,7 @@ define void @t17_mismatched_attrs_prevent_merge() personality ptr @__gxx_persona
11871172
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
11881173
; CHECK-NEXT: br i1 [[C0]], label %[[IF_THEN0:.*]], label %[[IF_ELSE:.*]]
11891174
; CHECK: [[IF_THEN0]]:
1190-
; CHECK-NEXT: invoke void @simple_throw() #[[ATTR4:[0-9]+]]
1175+
; CHECK-NEXT: invoke void @simple_throw() #[[ATTR3:[0-9]+]]
11911176
; CHECK-NEXT: to label %[[INVOKE_CONT0:.*]] unwind label %[[LPAD:.*]]
11921177
; CHECK: [[INVOKE_CONT0]]:
11931178
; CHECK-NEXT: unreachable
@@ -2693,6 +2678,5 @@ declare dso_local i32 @__gxx_personality_v0(...)
26932678
; CHECK: attributes #[[ATTR0:[0-9]+]] = { noreturn }
26942679
; CHECK: attributes #[[ATTR1]] = { nomerge }
26952680
; CHECK: attributes #[[ATTR2]] = { memory(none) }
2696-
; CHECK: attributes #[[ATTR3]] = { cold memory(none) }
2697-
; CHECK: attributes #[[ATTR4]] = { strictfp }
2681+
; CHECK: attributes #[[ATTR3]] = { strictfp }
26982682
;.

0 commit comments

Comments
 (0)