[llvm] 0d384e9 - [NFC][SimplifyCFG] Extract `IncomingValuesAreCompatible()` out of `SafeToMergeTerminators()`
Roman Lebedev via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 4 09:27:14 PST 2022
Author: Roman Lebedev
Date: 2022-02-04T20:26:44+03:00
New Revision: 0d384e9228231c766ce43b8ed27f75a1c15a0cf6
URL: https://github.com/llvm/llvm-project/commit/0d384e9228231c766ce43b8ed27f75a1c15a0cf6
DIFF: https://github.com/llvm/llvm-project/commit/0d384e9228231c766ce43b8ed27f75a1c15a0cf6.diff
LOG: [NFC][SimplifyCFG] Extract `IncomingValuesAreCompatible()` out of `SafeToMergeTerminators()`
Added:
Modified:
llvm/lib/Transforms/Utils/SimplifyCFG.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
index ce528e47efe1a..d72718e7222d9 100644
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -293,6 +293,23 @@ class SimplifyCFGOpt {
} // end anonymous namespace
+/// Return true if all the PHI nodes in the basic block \p BB
+/// receive compatible (identical) incoming values when coming from
+/// all of the predecessor blocks that are specified in \p IncomingBlocks.
+static bool IncomingValuesAreCompatible(BasicBlock *BB,
+ ArrayRef<BasicBlock *> IncomingBlocks) {
+ assert(IncomingBlocks.size() == 2 &&
+ "Only for a pair of incoming blocks at the time!");
+
+ // FIXME: it is okay if one of the incoming values is an `undef` value,
+ // iff the other incoming value is guaranteed to be a non-poison value.
+ // FIXME: it is okay if one of the incoming values is a `poison` value.
+ return all_of(BB->phis(), [IncomingBlocks](PHINode &PN) {
+ return PN.getIncomingValueForBlock(IncomingBlocks[0]) ==
+ PN.getIncomingValueForBlock(IncomingBlocks[1]);
+ });
+}
+
/// Return true if it is safe to merge these two
/// terminator instructions together.
static bool
@@ -309,17 +326,17 @@ SafeToMergeTerminators(Instruction *SI1, Instruction *SI2,
SmallPtrSet<BasicBlock *, 16> SI1Succs(succ_begin(SI1BB), succ_end(SI1BB));
bool Fail = false;
- for (BasicBlock *Succ : successors(SI2BB))
- if (SI1Succs.count(Succ))
- for (BasicBlock::iterator BBI = Succ->begin(); isa<PHINode>(BBI); ++BBI) {
- PHINode *PN = cast<PHINode>(BBI);
- if (PN->getIncomingValueForBlock(SI1BB) !=
- PN->getIncomingValueForBlock(SI2BB)) {
- if (FailBlocks)
- FailBlocks->insert(Succ);
- Fail = true;
- }
- }
+ for (BasicBlock *Succ : successors(SI2BB)) {
+ if (!SI1Succs.count(Succ))
+ continue;
+ if (IncomingValuesAreCompatible(Succ, {SI1BB, SI2BB}))
+ continue;
+ Fail = true;
+ if (FailBlocks)
+ FailBlocks->insert(Succ);
+ else
+ break;
+ }
return !Fail;
}
More information about the llvm-commits
mailing list