summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/MachinePostDominators.cpp
diff options
context:
space:
mode:
authorJakub Kuderski <kubakuderski@gmail.com>2019-09-25 14:04:36 +0000
committerJakub Kuderski <kubakuderski@gmail.com>2019-09-25 14:04:36 +0000
commit269bd15c68cae8492b954eb146bf729c12c003ee (patch)
tree0ae7bffb10244981e21bb8fb76a46329740c2fd0 /llvm/lib/CodeGen/MachinePostDominators.cpp
parentc5d90e4b5cf8842746f359e45047f569b9325adb (diff)
downloadbcm5719-llvm-269bd15c68cae8492b954eb146bf729c12c003ee.tar.gz
bcm5719-llvm-269bd15c68cae8492b954eb146bf729c12c003ee.zip
[Dominators][AMDGPU] Don't use virtual exit node in findNearestCommonDominator. Cleanup MachinePostDominators.
Summary: This patch fixes a bug that originated from passing a virtual exit block (nullptr) to `MachinePostDominatorTee::findNearestCommonDominator` and resulted in assertion failures inside its callee. It also applies a small cleanup to the class. The patch introduces a new function in PDT that given a list of `MachineBasicBlock`s finds their NCD. The new overload of `findNearestCommonDominator` handles virtual root correctly. Note that similar handling of virtual root nodes is not necessary in (forward) `DominatorTree`s, as right now they don't use virtual roots. Reviewers: tstellar, tpr, nhaehnle, arsenm, NutshellySima, grosser, hliao Reviewed By: hliao Subscribers: hliao, kzhuravl, jvesely, wdng, yaxunl, dstuttard, t-tye, hiraditya, llvm-commits Tags: #amdgpu, #llvm Differential Revision: https://reviews.llvm.org/D67974 llvm-svn: 372874
Diffstat (limited to 'llvm/lib/CodeGen/MachinePostDominators.cpp')
-rw-r--r--llvm/lib/CodeGen/MachinePostDominators.cpp44
1 files changed, 28 insertions, 16 deletions
diff --git a/llvm/lib/CodeGen/MachinePostDominators.cpp b/llvm/lib/CodeGen/MachinePostDominators.cpp
index 7f220ed1fd8..f2fc9f814f8 100644
--- a/llvm/lib/CodeGen/MachinePostDominators.cpp
+++ b/llvm/lib/CodeGen/MachinePostDominators.cpp
@@ -13,6 +13,8 @@
#include "llvm/CodeGen/MachinePostDominators.h"
+#include "llvm/ADT/STLExtras.h"
+
using namespace llvm;
namespace llvm {
@@ -25,33 +27,43 @@ char MachinePostDominatorTree::ID = 0;
INITIALIZE_PASS(MachinePostDominatorTree, "machinepostdomtree",
"MachinePostDominator Tree Construction", true, true)
-MachinePostDominatorTree::MachinePostDominatorTree() : MachineFunctionPass(ID) {
+MachinePostDominatorTree::MachinePostDominatorTree()
+ : MachineFunctionPass(ID), PDT(nullptr) {
initializeMachinePostDominatorTreePass(*PassRegistry::getPassRegistry());
- DT = new PostDomTreeBase<MachineBasicBlock>();
}
-FunctionPass *
-MachinePostDominatorTree::createMachinePostDominatorTreePass() {
+FunctionPass *MachinePostDominatorTree::createMachinePostDominatorTreePass() {
return new MachinePostDominatorTree();
}
-bool
-MachinePostDominatorTree::runOnMachineFunction(MachineFunction &F) {
- DT->recalculate(F);
+bool MachinePostDominatorTree::runOnMachineFunction(MachineFunction &F) {
+ PDT = std::make_unique<PostDomTreeT>();
+ PDT->recalculate(F);
return false;
}
-MachinePostDominatorTree::~MachinePostDominatorTree() {
- delete DT;
-}
-
-void
-MachinePostDominatorTree::getAnalysisUsage(AnalysisUsage &AU) const {
+void MachinePostDominatorTree::getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesAll();
MachineFunctionPass::getAnalysisUsage(AU);
}
-void
-MachinePostDominatorTree::print(llvm::raw_ostream &OS, const Module *M) const {
- DT->print(OS);
+MachineBasicBlock *MachinePostDominatorTree::findNearestCommonDominator(
+ ArrayRef<MachineBasicBlock *> Blocks) const {
+ assert(!Blocks.empty());
+
+ MachineBasicBlock *NCD = Blocks.front();
+ for (MachineBasicBlock *BB : Blocks.drop_front()) {
+ NCD = PDT->findNearestCommonDominator(NCD, BB);
+
+ // Stop when the root is reached.
+ if (PDT->isVirtualRoot(PDT->getNode(NCD)))
+ return nullptr;
+ }
+
+ return NCD;
+}
+
+void MachinePostDominatorTree::print(llvm::raw_ostream &OS,
+ const Module *M) const {
+ PDT->print(OS);
}
OpenPOWER on IntegriCloud