diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2021-08-22 19:00:43 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2021-11-13 20:39:49 +0000 |
commit | fe6060f10f634930ff71b7c50291ddc610da2475 (patch) | |
tree | 1483580c790bd4d27b6500a7542b5ee00534d3cc /contrib/llvm-project/llvm/lib/CodeGen/MachineCSE.cpp | |
parent | b61bce17f346d79cecfd8f195a64b10f77be43b1 (diff) | |
parent | 344a3780b2e33f6ca763666c380202b18aab72a3 (diff) |
Diffstat (limited to 'contrib/llvm-project/llvm/lib/CodeGen/MachineCSE.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/CodeGen/MachineCSE.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/MachineCSE.cpp b/contrib/llvm-project/llvm/lib/CodeGen/MachineCSE.cpp index 199fe2dc6454..cb2e18e8c813 100644 --- a/contrib/llvm-project/llvm/lib/CodeGen/MachineCSE.cpp +++ b/contrib/llvm-project/llvm/lib/CodeGen/MachineCSE.cpp @@ -588,6 +588,23 @@ bool MachineCSE::ProcessBlockCSE(MachineBasicBlock *MBB) { LLVM_DEBUG(dbgs() << "Examining: " << *MI); LLVM_DEBUG(dbgs() << "*** Found a common subexpression: " << *CSMI); + // Prevent CSE-ing non-local convergent instructions. + // LLVM's current definition of `isConvergent` does not necessarily prove + // that non-local CSE is illegal. The following check extends the definition + // of `isConvergent` to assume a convergent instruction is dependent not + // only on additional conditions, but also on fewer conditions. LLVM does + // not have a MachineInstr attribute which expresses this extended + // definition, so it's necessary to use `isConvergent` to prevent illegally + // CSE-ing the subset of `isConvergent` instructions which do fall into this + // extended definition. + if (MI->isConvergent() && MI->getParent() != CSMI->getParent()) { + LLVM_DEBUG(dbgs() << "*** Convergent MI and subexpression exist in " + "different BBs, avoid CSE!\n"); + VNT.insert(MI, CurrVN++); + Exps.push_back(MI); + continue; + } + // Check if it's profitable to perform this CSE. bool DoCSE = true; unsigned NumDefs = MI->getNumDefs(); @@ -820,6 +837,15 @@ bool MachineCSE::ProcessBlockPRE(MachineDominatorTree *DT, if (BB != nullptr && BB1 != nullptr && (isPotentiallyReachable(BB1, BB) || isPotentiallyReachable(BB, BB1))) { + // The following check extends the definition of `isConvergent` to + // assume a convergent instruction is dependent not only on additional + // conditions, but also on fewer conditions. LLVM does not have a + // MachineInstr attribute which expresses this extended definition, so + // it's necessary to use `isConvergent` to prevent illegally PRE-ing the + // subset of `isConvergent` instructions which do fall into this + // extended definition. + if (MI->isConvergent() && CMBB != MBB) + continue; assert(MI->getOperand(0).isDef() && "First operand of instr with one explicit def must be this def"); |