diff options
author | Wei Ding <wei.ding2@amd.com> | 2017-04-12 23:51:47 +0000 |
---|---|---|
committer | Wei Ding <wei.ding2@amd.com> | 2017-04-12 23:51:47 +0000 |
commit | 74da350b850efd10643ce9b76043e0e9df59a1b2 (patch) | |
tree | d8a57f05977760ce3d1f9b06b597a14bde6f2552 /llvm/lib | |
parent | a13714ea5f8e95c5969271b74d490f0dd829cc71 (diff) | |
download | bcm5719-llvm-74da350b850efd10643ce9b76043e0e9df59a1b2.tar.gz bcm5719-llvm-74da350b850efd10643ce9b76043e0e9df59a1b2.zip |
AMDGPU : Fix common dominator of two incoming blocks terminates with uniform branch issue.
Differential Revision: http://reviews.llvm.org/D31350
llvm-svn: 300142
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/AMDGPU/SIFixSGPRCopies.cpp | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/llvm/lib/Target/AMDGPU/SIFixSGPRCopies.cpp b/llvm/lib/Target/AMDGPU/SIFixSGPRCopies.cpp index 34cd6f704a1..f9d258f44a6 100644 --- a/llvm/lib/Target/AMDGPU/SIFixSGPRCopies.cpp +++ b/llvm/lib/Target/AMDGPU/SIFixSGPRCopies.cpp @@ -65,6 +65,7 @@ /// ultimately led to the creation of an illegal COPY. //===----------------------------------------------------------------------===// +#include "llvm/ADT/DenseSet.h" #include "AMDGPU.h" #include "AMDGPUSubtarget.h" #include "SIInstrInfo.h" @@ -331,6 +332,27 @@ static bool isSafeToFoldImmIntoCopy(const MachineInstr *Copy, return true; } +static bool predsHasDivergentTerminator(MachineBasicBlock *MBB, + const TargetRegisterInfo *TRI) { + DenseSet<MachineBasicBlock*> Visited; + SmallVector<MachineBasicBlock*, 4> Worklist(MBB->pred_begin(), + MBB->pred_end()); + + while (!Worklist.empty()) { + MachineBasicBlock *mbb = Worklist.back(); + Worklist.pop_back(); + + if (!Visited.insert(mbb).second) + continue; + if (hasTerminatorThatModifiesExec(*mbb, *TRI)) + return true; + + Worklist.insert(Worklist.end(), mbb->pred_begin(), mbb->pred_end()); + } + + return false; +} + bool SIFixSGPRCopies::runOnMachineFunction(MachineFunction &MF) { const SISubtarget &ST = MF.getSubtarget<SISubtarget>(); MachineRegisterInfo &MRI = MF.getRegInfo(); @@ -387,8 +409,8 @@ bool SIFixSGPRCopies::runOnMachineFunction(MachineFunction &MF) { MachineBasicBlock *MBB0 = MI.getOperand(2).getMBB(); MachineBasicBlock *MBB1 = MI.getOperand(4).getMBB(); - MachineBasicBlock *NCD = MDT->findNearestCommonDominator(MBB0, MBB1); - if (NCD && !hasTerminatorThatModifiesExec(*NCD, *TRI)) { + if (!predsHasDivergentTerminator(MBB0, TRI) && + !predsHasDivergentTerminator(MBB1, TRI)) { DEBUG(dbgs() << "Not fixing PHI for uniform branch: " << MI << '\n'); break; } |