[llvm] 414b476 - [SimplifyCFG] 'merge compatible invokes': don't create trivial PHI's with all-identical incoming values
Roman Lebedev via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 8 10:30:08 PST 2022
Author: Roman Lebedev
Date: 2022-02-08T21:29:38+03:00
New Revision: 414b47645d8b045a4a9d2dbce67a8a4107a4fe72
URL: https://github.com/llvm/llvm-project/commit/414b47645d8b045a4a9d2dbce67a8a4107a4fe72
DIFF: https://github.com/llvm/llvm-project/commit/414b47645d8b045a4a9d2dbce67a8a4107a4fe72.diff
LOG: [SimplifyCFG] 'merge compatible invokes': don't create trivial PHI's with all-identical incoming values
Added:
Modified:
llvm/lib/Transforms/Utils/SimplifyCFG.cpp
llvm/test/Transforms/SimplifyCFG/X86/merge-compatible-invokes-of-landingpad.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
index dba67d4319e7..2f6757356dad 100644
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -2438,14 +2438,16 @@ static void MergeCompatibleInvokesImpl(ArrayRef<InvokeInst *> Invokes,
// Form the merged data operands for the merged invoke.
for (Use &U : MergedInvoke->data_ops()) {
- Type *Ty = U->getType();
- if (Ty->isTokenTy())
- continue; // Keep this arg as-is, we've checked that all the invokes
- // recieve the *same* token value.
-
- // Otherwise, simply form a PHI out of all the data ops under this index.
- PHINode *PN = PHINode::Create(Ty, /*NumReservedValues=*/Invokes.size(), "",
- MergedInvoke);
+ // Don't create trivial PHI's with all-identical incoming values.
+ bool NeedPHI = any_of(Invokes, [&U](InvokeInst *II) {
+ return II->getOperand(U.getOperandNo()) != U.get();
+ });
+ if (!NeedPHI)
+ continue;
+
+ // Form a PHI out of all the data ops under this index.
+ PHINode *PN = PHINode::Create(
+ U->getType(), /*NumReservedValues=*/Invokes.size(), "", MergedInvoke);
for (InvokeInst *II : Invokes) {
Use *IVU = II->data_operands_begin() + MergedInvoke->getDataOperandNo(&U);
PN->addIncoming(IVU->get(), II->getParent());
diff --git a/llvm/test/Transforms/SimplifyCFG/X86/merge-compatible-invokes-of-landingpad.ll b/llvm/test/Transforms/SimplifyCFG/X86/merge-compatible-invokes-of-landingpad.ll
index 49c2b72057c4..fb4444298461 100644
--- a/llvm/test/Transforms/SimplifyCFG/X86/merge-compatible-invokes-of-landingpad.ll
+++ b/llvm/test/Transforms/SimplifyCFG/X86/merge-compatible-invokes-of-landingpad.ll
@@ -696,8 +696,7 @@ define void @t12_arguments_are_fine() personality i8* bitcast (i32 (...)* @__gxx
; CHECK-NEXT: [[C1:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1_INVOKE]], label [[IF_END:%.*]]
; CHECK: if.then1.invoke:
-; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ 42, [[IF_ELSE]] ], [ 42, [[ENTRY:%.*]] ]
-; CHECK-NEXT: invoke void @simple_throw_taking_argument(i32 [[TMP0]])
+; CHECK-NEXT: invoke void @simple_throw_taking_argument(i32 42)
; CHECK-NEXT: to label [[IF_THEN1_CONT:%.*]] unwind label [[LPAD:%.*]]
; CHECK: if.then1.cont:
; CHECK-NEXT: unreachable
@@ -1136,8 +1135,7 @@ define void @t19_compatible_operand_bundle() personality i8* bitcast (i32 (...)*
; CHECK-NEXT: [[C1:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1_INVOKE]], label [[IF_END:%.*]]
; CHECK: if.then1.invoke:
-; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ 42, [[IF_ELSE]] ], [ 42, [[ENTRY:%.*]] ]
-; CHECK-NEXT: invoke void @simple_throw() [ "abc"(i32 [[TMP0]]) ]
+; CHECK-NEXT: invoke void @simple_throw() [ "abc"(i32 42) ]
; CHECK-NEXT: to label [[IF_THEN1_CONT:%.*]] unwind label [[LPAD:%.*]]
; CHECK: if.then1.cont:
; CHECK-NEXT: unreachable
More information about the llvm-commits
mailing list