summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AMDGPU/SIAnnotateControlFlow.cpp
diff options
context:
space:
mode:
authorChangpeng Fang <changpeng.fang@gmail.com>2019-03-15 21:02:48 +0000
committerChangpeng Fang <changpeng.fang@gmail.com>2019-03-15 21:02:48 +0000
commit989ec59c9f04d89ac4f3dc3e653b96996dd6eafe (patch)
treea4c0e59e0a862979ffefc015db75e83188ff039d /llvm/lib/Target/AMDGPU/SIAnnotateControlFlow.cpp
parent5ac90b8ba1b321c7ebc4f2fc1ae495d834aaadf5 (diff)
downloadbcm5719-llvm-989ec59c9f04d89ac4f3dc3e653b96996dd6eafe.tar.gz
bcm5719-llvm-989ec59c9f04d89ac4f3dc3e653b96996dd6eafe.zip
AMDGPU: Fix a SIAnnotateControlFlow issue when there are multiple backedges.
Summary: At the exit of the loop, the compiler uses a register to remember and accumulate the number of threads that have already exited. When all active threads exit the loop, this register is used to restore the exec mask, and the execution continues for the post loop code. When there is a "continue" in the loop, the compiler made a mistake to reset the register to 0 when the "continue" backedge is taken. This will result in some threads not executing the post loop code as they are supposed to. This patch fixed the issue. Reviewers: nhaehnle, arsenm Differential Revision: https://reviews.llvm.org/D59312 llvm-svn: 356298
Diffstat (limited to 'llvm/lib/Target/AMDGPU/SIAnnotateControlFlow.cpp')
-rw-r--r--llvm/lib/Target/AMDGPU/SIAnnotateControlFlow.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/llvm/lib/Target/AMDGPU/SIAnnotateControlFlow.cpp b/llvm/lib/Target/AMDGPU/SIAnnotateControlFlow.cpp
index 45642288948..a26c12bb934 100644
--- a/llvm/lib/Target/AMDGPU/SIAnnotateControlFlow.cpp
+++ b/llvm/lib/Target/AMDGPU/SIAnnotateControlFlow.cpp
@@ -264,8 +264,17 @@ void SIAnnotateControlFlow::handleLoop(BranchInst *Term) {
Term->setCondition(BoolTrue);
Value *Arg = handleLoopCondition(Cond, Broken, L, Term);
- for (BasicBlock *Pred : predecessors(Target))
- Broken->addIncoming(Pred == BB ? Arg : Int64Zero, Pred);
+ for (BasicBlock *Pred : predecessors(Target)) {
+ Value *PHIValue = Int64Zero;
+ if (Pred == BB) // Remember the value of the previous iteration.
+ PHIValue = Arg;
+ // If the backedge from Pred to Target could be executed before the exit
+ // of the loop at BB, it should not reset or change "Broken", which keeps
+ // track of the number of threads exited the loop at BB.
+ else if (L->contains(Pred) && DT->dominates(Pred, BB))
+ PHIValue = Broken;
+ Broken->addIncoming(PHIValue, Pred);
+ }
Term->setCondition(CallInst::Create(Loop, Arg, "", Term));
OpenPOWER on IntegriCloud