aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2022-02-05 18:04:23 +0000
committerDimitry Andric <dim@FreeBSD.org>2022-02-05 18:05:05 +0000
commitecbca9f5fb7d7613d2b94982c4825eb0d33d6842 (patch)
tree3a4038f3b7bafaeade9fd6146ea8021237616657 /llvm/lib/Transforms/Scalar/StructurizeCFG.cpp
parent6f8fc217eaa12bf657be1c6468ed9938d10168b3 (diff)
downloadsrc-ecbca9f5fb7d7613d2b94982c4825eb0d33d6842.tar.gz
src-ecbca9f5fb7d7613d2b94982c4825eb0d33d6842.zip
Vendor import of llvm-project main llvmorg-14-init-18294-gdb01b123d012,vendor/llvm-project/llvmorg-14-init-18294-gdb01b123d012
the last commit before the upstream release/14.x branch was created.
Diffstat (limited to 'llvm/lib/Transforms/Scalar/StructurizeCFG.cpp')
-rw-r--r--llvm/lib/Transforms/Scalar/StructurizeCFG.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp b/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp
index ac580b4161f4..b3a445368537 100644
--- a/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp
+++ b/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp
@@ -276,6 +276,8 @@ class StructurizeCFG {
void insertConditions(bool Loops);
+ void simplifyConditions();
+
void delPhiValues(BasicBlock *From, BasicBlock *To);
void addPhiValues(BasicBlock *From, BasicBlock *To);
@@ -586,6 +588,28 @@ void StructurizeCFG::insertConditions(bool Loops) {
}
}
+/// Simplify any inverted conditions that were built by buildConditions.
+void StructurizeCFG::simplifyConditions() {
+ SmallVector<Instruction *> InstToErase;
+ for (auto &I : concat<PredMap::value_type>(Predicates, LoopPreds)) {
+ auto &Preds = I.second;
+ for (auto &J : Preds) {
+ auto &Cond = J.second;
+ Instruction *Inverted;
+ if (match(Cond, m_Not(m_OneUse(m_Instruction(Inverted)))) &&
+ !Cond->use_empty()) {
+ if (auto *InvertedCmp = dyn_cast<CmpInst>(Inverted)) {
+ InvertedCmp->setPredicate(InvertedCmp->getInversePredicate());
+ Cond->replaceAllUsesWith(InvertedCmp);
+ InstToErase.push_back(cast<Instruction>(Cond));
+ }
+ }
+ }
+ }
+ for (auto *I : InstToErase)
+ I->eraseFromParent();
+}
+
/// Remove all PHI values coming from "From" into "To" and remember
/// them in DeletedPhis
void StructurizeCFG::delPhiValues(BasicBlock *From, BasicBlock *To) {
@@ -1065,6 +1089,7 @@ bool StructurizeCFG::run(Region *R, DominatorTree *DT) {
createFlow();
insertConditions(false);
insertConditions(true);
+ simplifyConditions();
setPhiValues();
simplifyAffectedPhis();
rebuildSSA();