summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AMDGPU/SILowerI1Copies.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/Target/AMDGPU/SILowerI1Copies.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/Target/AMDGPU/SILowerI1Copies.cpp')
-rw-r--r--llvm/lib/Target/AMDGPU/SILowerI1Copies.cpp20
1 files changed, 10 insertions, 10 deletions
diff --git a/llvm/lib/Target/AMDGPU/SILowerI1Copies.cpp b/llvm/lib/Target/AMDGPU/SILowerI1Copies.cpp
index 86242f1fb64..b4541253635 100644
--- a/llvm/lib/Target/AMDGPU/SILowerI1Copies.cpp
+++ b/llvm/lib/Target/AMDGPU/SILowerI1Copies.cpp
@@ -589,12 +589,12 @@ void SILowerI1Copies::lowerPhis() {
// Phis in a loop that are observed outside the loop receive a simple but
// conservatively correct treatment.
- MachineBasicBlock *PostDomBound = &MBB;
- for (MachineInstr &Use : MRI->use_instructions(DstReg)) {
- PostDomBound =
- PDT->findNearestCommonDominator(PostDomBound, Use.getParent());
- }
+ std::vector<MachineBasicBlock *> DomBlocks = {&MBB};
+ for (MachineInstr &Use : MRI->use_instructions(DstReg))
+ DomBlocks.push_back(Use.getParent());
+ MachineBasicBlock *PostDomBound =
+ PDT->findNearestCommonDominator(DomBlocks);
unsigned FoundLoopLevel = LF.findLoop(PostDomBound);
SSAUpdater.Initialize(DstReg);
@@ -711,12 +711,12 @@ void SILowerI1Copies::lowerCopiesToI1() {
// Defs in a loop that are observed outside the loop must be transformed
// into appropriate bit manipulation.
- MachineBasicBlock *PostDomBound = &MBB;
- for (MachineInstr &Use : MRI->use_instructions(DstReg)) {
- PostDomBound =
- PDT->findNearestCommonDominator(PostDomBound, Use.getParent());
- }
+ std::vector<MachineBasicBlock *> DomBlocks = {&MBB};
+ for (MachineInstr &Use : MRI->use_instructions(DstReg))
+ DomBlocks.push_back(Use.getParent());
+ MachineBasicBlock *PostDomBound =
+ PDT->findNearestCommonDominator(DomBlocks);
unsigned FoundLoopLevel = LF.findLoop(PostDomBound);
if (FoundLoopLevel) {
SSAUpdater.Initialize(DstReg);
OpenPOWER on IntegriCloud