Fix some nondeterministic behavior when forwarding
authorDale Johannesen <dalej@apple.com>
Thu, 12 Mar 2009 01:00:26 +0000 (01:00 +0000)
committerDale Johannesen <dalej@apple.com>
Thu, 12 Mar 2009 01:00:26 +0000 (01:00 +0000)
from a switch table.  Multiple table entries that
branch to the same place were being sorted by the
pointer value of the ConstantInt*; changed to sort
by the actual value of the ConstantInt.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66749 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Utils/SimplifyCFG.cpp

index 264e4e0df447c97eb5252fe8ad6e989893977392..80eab1c1f87c0345adbff18e130b1ed36344a72d 100644 (file)
@@ -719,6 +719,16 @@ static bool SimplifyEqualityComparisonWithOnlyPredecessor(TerminatorInst *TI,
   return false;
 }
 
+/// A sorting function for the std::set's in the following function which track
+/// the values in switches.  This forces deterministic behavior by comparing
+/// the values rather than the pointers.
+class Sorter {
+public:
+  bool operator() (ConstantInt * const &p, ConstantInt * const &q) const {
+    return p->getSExtValue() < q->getSExtValue();
+  }
+};
+
 /// FoldValueComparisonIntoPredecessors - The specified terminator is a value
 /// equality comparison instruction (either a switch or a branch on "X == c").
 /// See if any of the predecessors of the terminator block are value comparisons
@@ -754,7 +764,7 @@ static bool FoldValueComparisonIntoPredecessors(TerminatorInst *TI) {
       if (PredDefault == BB) {
         // If this is the default destination from PTI, only the edges in TI
         // that don't occur in PTI, or that branch to BB will be activated.
-        std::set<ConstantInt*> PTIHandled;
+        std::set<ConstantInt*, Sorter> PTIHandled;
         for (unsigned i = 0, e = PredCases.size(); i != e; ++i)
           if (PredCases[i].second != BB)
             PTIHandled.insert(PredCases[i].first);
@@ -782,7 +792,7 @@ static bool FoldValueComparisonIntoPredecessors(TerminatorInst *TI) {
         // If this is not the default destination from PSI, only the edges
         // in SI that occur in PSI with a destination of BB will be
         // activated.
-        std::set<ConstantInt*> PTIHandled;
+        std::set<ConstantInt*, Sorter> PTIHandled;
         for (unsigned i = 0, e = PredCases.size(); i != e; ++i)
           if (PredCases[i].second == BB) {
             PTIHandled.insert(PredCases[i].first);
@@ -803,7 +813,7 @@ static bool FoldValueComparisonIntoPredecessors(TerminatorInst *TI) {
 
         // If there are any constants vectored to BB that TI doesn't handle,
         // they must go to the default destination of TI.
-        for (std::set<ConstantInt*>::iterator I = PTIHandled.begin(),
+        for (std::set<ConstantInt*, Sorter>::iterator I = PTIHandled.begin(),
                E = PTIHandled.end(); I != E; ++I) {
           PredCases.push_back(std::make_pair(*I, BBDefault));
           NewSuccessors.push_back(BBDefault);