R600/structurizer: improve finding condition values
authorChristian Konig <christian.koenig@amd.com>
Sat, 16 Feb 2013 11:27:40 +0000 (11:27 +0000)
committerChristian Konig <christian.koenig@amd.com>
Sat, 16 Feb 2013 11:27:40 +0000 (11:27 +0000)
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

lib/Target/R600/AMDGPUStructurizeCFG.cpp

index 38013476188d8835c8d9d365475bcec77dbca2c8..e97e049be58be2352e0e10acfa0c207a399a7672 100644 (file)
@@ -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));
+    }
   }
 }