summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/R600/AMDGPUStructurizeCFG.cpp
diff options
context:
space:
mode:
authorChristian Konig <christian.koenig@amd.com>2013-02-16 11:27:40 +0000
committerChristian Konig <christian.koenig@amd.com>2013-02-16 11:27:40 +0000
commitb5d8866b84734264e31a47f56fcf921b37728006 (patch)
tree0cecc20f4c93ddf2abf78f66af0091514a30c74b /llvm/lib/Target/R600/AMDGPUStructurizeCFG.cpp
parent0bccf9d60b2a7a33653e2fa18c6028c0546bbb61 (diff)
downloadbcm5719-llvm-b5d8866b84734264e31a47f56fcf921b37728006.tar.gz
bcm5719-llvm-b5d8866b84734264e31a47f56fcf921b37728006.zip
R600/structurizer: improve finding condition values
Using the new NearestCommonDominator class. This is a candidate for the stable branch. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Tom Stellard <thomas.stellard@amd.com> llvm-svn: 175347
Diffstat (limited to 'llvm/lib/Target/R600/AMDGPUStructurizeCFG.cpp')
-rw-r--r--llvm/lib/Target/R600/AMDGPUStructurizeCFG.cpp31
1 files changed, 22 insertions, 9 deletions
diff --git a/llvm/lib/Target/R600/AMDGPUStructurizeCFG.cpp b/llvm/lib/Target/R600/AMDGPUStructurizeCFG.cpp
index 38013476188..e97e049be58 100644
--- a/llvm/lib/Target/R600/AMDGPUStructurizeCFG.cpp
+++ b/llvm/lib/Target/R600/AMDGPUStructurizeCFG.cpp
@@ -458,28 +458,41 @@ void AMDGPUStructurizeCFG::insertConditions() {
assert(Term->isConditional());
+ Value *Default = (Parent == LoopEnd) ? BoolTrue : BoolFalse;
+
PhiInserter.Initialize(Boolean, "");
- if (Parent == LoopEnd) {
+ PhiInserter.AddAvailableValue(&Func->getEntryBlock(), Default);
+ if (Parent == LoopEnd)
PhiInserter.AddAvailableValue(LoopStart, BoolTrue);
- } else {
- PhiInserter.AddAvailableValue(&Func->getEntryBlock(), BoolFalse);
+ else
PhiInserter.AddAvailableValue(Parent, BoolFalse);
- }
- bool ParentHasValue = false;
BasicBlock *Succ = Term->getSuccessor(0);
BBPredicates &Preds = (Parent == LoopEnd) ? LoopPred : Predicates[Succ];
+
+ NearestCommonDominator Dominator(DT);
+ Dominator.addBlock(Parent, false);
+
+ Value *ParentValue = 0;
for (BBPredicates::iterator PI = Preds.begin(), PE = Preds.end();
PI != PE; ++PI) {
+ if (PI->first == Parent) {
+ ParentValue = PI->second;
+ break;
+ }
PhiInserter.AddAvailableValue(PI->first, PI->second);
- ParentHasValue |= PI->first == Parent;
+ Dominator.addBlock(PI->first);
}
- if (ParentHasValue)
- Term->setCondition(PhiInserter.GetValueAtEndOfBlock(Parent));
- else
+ if (ParentValue) {
+ Term->setCondition(ParentValue);
+ } else {
+ if (!Dominator.wasResultExplicitMentioned())
+ PhiInserter.AddAvailableValue(Dominator.getResult(), Default);
+
Term->setCondition(PhiInserter.GetValueInMiddleOfBlock(Parent));
+ }
}
}
OpenPOWER on IntegriCloud