summaryrefslogtreecommitdiff
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
commit25bd884c3d0e9803dfafda10e7ecede152ad156f (patch)
treee65232a2d6bee2e28d1c3012b45dba80dcb64ef1
parent4c79c71d99336baf312e2784311b257c5d9eebce (diff)
downloadllvm-25bd884c3d0e9803dfafda10e7ecede152ad156f.tar.gz
llvm-25bd884c3d0e9803dfafda10e7ecede152ad156f.tar.bz2
llvm-25bd884c3d0e9803dfafda10e7ecede152ad156f.tar.xz
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> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@175347 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/R600/AMDGPUStructurizeCFG.cpp31
1 files changed, 22 insertions, 9 deletions
diff --git a/lib/Target/R600/AMDGPUStructurizeCFG.cpp b/lib/Target/R600/AMDGPUStructurizeCFG.cpp
index 3801347618..e97e049be5 100644
--- a/lib/Target/R600/AMDGPUStructurizeCFG.cpp
+++ b/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));
+ }
}
}