[llvm] [DeadStoreElimination] Optimize tautological assignments (PR #75744)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Sat Jan 13 01:06:24 PST 2024
================
@@ -1901,6 +1901,52 @@ struct DSEState {
return true;
}
+ // Check if there is a dominating condition, that implies that the value
+ // being stored in a ptr is already present in the ptr.
+ bool dominatingConditionImpliesValue(MemoryDef *Def) {
+ StoreInst *StoreI = dyn_cast<StoreInst>(Def->getMemoryInst());
+ BasicBlock *StoreBB = StoreI->getParent();
+ Value *StorePtr = StoreI->getPointerOperand();
+ Value *StoreVal = StoreI->getValueOperand();
+
+ DomTreeNode *IDom = DT.getNode(StoreBB)->getIDom();
+ if (!IDom)
+ return false;
+
+ auto *BI = dyn_cast<BranchInst>(IDom->getBlock()->getTerminator());
+ if (!BI || !BI->isConditional())
+ return false;
+
+ // In case both blocks are the same, we cannot optimize the FalseBB when the
+ // condition is true and vice versa. Return false in this case.
+ if (BI->getSuccessor(0) == BI->getSuccessor(1))
+ return false;
+
+ Instruction *ICmpL;
+ ICmpInst::Predicate Pred;
+ if (!match(BI->getCondition(),
+ m_c_ICmp(Pred,
+ m_CombineAnd(m_Load(m_Specific(StorePtr)),
+ m_Instruction(ICmpL)),
+ m_Specific(StoreVal))) ||
+ !ICmpInst::isEquality(Pred))
+ return false;
+
+ if (Pred == ICmpInst::ICMP_EQ && StoreBB != BI->getSuccessor(0))
+ return false;
+
+ if (Pred == ICmpInst::ICMP_NE && StoreBB != BI->getSuccessor(1))
+ return false;
+
+ MemoryAccess *LoadAcc = MSSA.getMemoryAccess(ICmpL);
+ MemoryAccess *ClobAcc =
+ MSSA.getSkipSelfWalker()->getClobberingMemoryAccess(Def, BatchAA);
+ if (!MSSA.dominates(ClobAcc, LoadAcc))
+ return false;
+
+ return true;
----------------
nikic wrote:
```suggestion
return MSSA.dominates(ClobAcc, LoadAcc);
```
https://github.com/llvm/llvm-project/pull/75744
More information about the llvm-commits
mailing list