[llvm] r256036 - [DivergenceAnalysis] fix a bug in computing influence regions
Jingyue Wu via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 18 13:44:26 PST 2015
Author: jingyue
Date: Fri Dec 18 15:44:26 2015
New Revision: 256036
URL: http://llvm.org/viewvc/llvm-project?rev=256036&view=rev
Log:
[DivergenceAnalysis] fix a bug in computing influence regions
Fixes PR25864
Modified:
llvm/trunk/lib/Analysis/DivergenceAnalysis.cpp
llvm/trunk/test/Analysis/DivergenceAnalysis/NVPTX/diverge.ll
Modified: llvm/trunk/lib/Analysis/DivergenceAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/DivergenceAnalysis.cpp?rev=256036&r1=256035&r2=256036&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/DivergenceAnalysis.cpp (original)
+++ llvm/trunk/lib/Analysis/DivergenceAnalysis.cpp Fri Dec 18 15:44:26 2015
@@ -96,7 +96,7 @@ private:
// A helper function that explores sync dependents of TI.
void exploreSyncDependency(TerminatorInst *TI);
// Computes the influence region from Start to End. This region includes all
- // basic blocks on any path from Start to End.
+ // basic blocks on any simple path from Start to End.
void computeInfluenceRegion(BasicBlock *Start, BasicBlock *End,
DenseSet<BasicBlock *> &InfluenceRegion);
// Finds all users of I that are outside the influence region, and add these
@@ -198,21 +198,33 @@ void DivergencePropagator::findUsersOuts
}
}
+// A helper function for computeInfluenceRegion that adds successors of "ThisBB"
+// to the influence region.
+static void
+addSuccessorsToInfluenceRegion(BasicBlock *ThisBB, BasicBlock *End,
+ DenseSet<BasicBlock *> &InfluenceRegion,
+ std::vector<BasicBlock *> &InfluenceStack) {
+ for (BasicBlock *Succ : successors(ThisBB)) {
+ if (Succ != End && InfluenceRegion.insert(Succ).second)
+ InfluenceStack.push_back(Succ);
+ }
+}
+
void DivergencePropagator::computeInfluenceRegion(
BasicBlock *Start, BasicBlock *End,
DenseSet<BasicBlock *> &InfluenceRegion) {
assert(PDT.properlyDominates(End, Start) &&
"End does not properly dominate Start");
+
+ // The influence region starts from the end of "Start" to the beginning of
+ // "End". Therefore, "Start" should not be in the region unless "Start" is in
+ // a loop that doesn't contain "End".
std::vector<BasicBlock *> InfluenceStack;
- InfluenceStack.push_back(Start);
- InfluenceRegion.insert(Start);
+ addSuccessorsToInfluenceRegion(Start, End, InfluenceRegion, InfluenceStack);
while (!InfluenceStack.empty()) {
BasicBlock *BB = InfluenceStack.back();
InfluenceStack.pop_back();
- for (BasicBlock *Succ : successors(BB)) {
- if (End != Succ && InfluenceRegion.insert(Succ).second)
- InfluenceStack.push_back(Succ);
- }
+ addSuccessorsToInfluenceRegion(BB, End, InfluenceRegion, InfluenceStack);
}
}
Modified: llvm/trunk/test/Analysis/DivergenceAnalysis/NVPTX/diverge.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/DivergenceAnalysis/NVPTX/diverge.ll?rev=256036&r1=256035&r2=256036&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/DivergenceAnalysis/NVPTX/diverge.ll (original)
+++ llvm/trunk/test/Analysis/DivergenceAnalysis/NVPTX/diverge.ll Fri Dec 18 15:44:26 2015
@@ -185,14 +185,35 @@ else:
ret i32 1
}
+; Verifies sync-dependence is computed correctly in the absense of loops.
+define i32 @sync_no_loop(i32 %arg) {
+entry:
+ %0 = add i32 %arg, 1
+ %tid = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
+ %1 = icmp sge i32 %tid, 10
+ br i1 %1, label %bb1, label %bb2
+
+bb1:
+ br label %bb3
+
+bb2:
+ br label %bb3
+
+bb3:
+ %2 = add i32 %0, 2
+ ; CHECK-NOT: DIVERGENT: %2
+ ret i32 %2
+}
+
declare i32 @llvm.nvvm.read.ptx.sreg.tid.x()
declare i32 @llvm.nvvm.read.ptx.sreg.tid.y()
declare i32 @llvm.nvvm.read.ptx.sreg.tid.z()
declare i32 @llvm.ptx.read.laneid()
-!nvvm.annotations = !{!0, !1, !2, !3, !4}
+!nvvm.annotations = !{!0, !1, !2, !3, !4, !5}
!0 = !{i32 (i32, i32, i32)* @no_diverge, !"kernel", i32 1}
!1 = !{i32 (i32, i32)* @sync, !"kernel", i32 1}
!2 = !{i32 (i32, i32, i32)* @mixed, !"kernel", i32 1}
!3 = !{i32 ()* @loop, !"kernel", i32 1}
!4 = !{i32 (i1)* @unstructured_loop, !"kernel", i32 1}
+!5 = !{i32 (i32)* @sync_no_loop, !"kernel", i32 1}
More information about the llvm-commits
mailing list