Fix non-determinism introduced in r168970 and pointed out by Duncan.
authorChandler Carruth <chandlerc@gmail.com>
Fri, 30 Nov 2012 09:34:29 +0000 (09:34 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Fri, 30 Nov 2012 09:34:29 +0000 (09:34 +0000)
We're iterating over a non-deterministically ordered container looking
for two saturating flags. To do this correctly, we have to saturate
both, and only stop looping if both saturate to their final value.
Otherwise, which flag we see first changes the result.

This is also a micro-optimization of the previous version as now we
don't go into the (possibly expensive) test logic once the first
violation of either constraint is detected.

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

lib/Transforms/Utils/SimplifyCFG.cpp

index 5a1b21025cca7dad43be0132ea14c2234b1a1861..f6d43a9e6cec6436542f028c11655fad892df564 100644 (file)
@@ -3521,12 +3521,20 @@ static bool ShouldBuildLookupTable(SwitchInst *SI,
   for (SmallDenseMap<PHINode*, Type*>::const_iterator I = ResultTypes.begin(),
        E = ResultTypes.end(); I != E; ++I) {
     Type *Ty = I->second;
-    if (!TTI->getScalarTargetTransformInfo()->isTypeLegal(Ty))
-      HasIllegalType = true;
-    if (!SwitchLookupTable::WouldFitInRegister(TD, TableSize, Ty)) {
-      AllTablesFitInRegister = false;
+
+    // Saturate this flag to true.
+    HasIllegalType = HasIllegalType ||
+      !TTI->getScalarTargetTransformInfo()->isTypeLegal(Ty);
+
+    // Saturate this flag to false.
+    AllTablesFitInRegister = AllTablesFitInRegister &&
+      SwitchLookupTable::WouldFitInRegister(TD, TableSize, Ty);
+
+    // If both flags saturate, we're done. NOTE: This *only* works with
+    // saturating flags, and all flags have to saturate first due to the
+    // non-deterministic behavior of iterating over a dense map.
+    if (HasIllegalType && !AllTablesFitInRegister)
       break;
-    }
   }
 
   // If each table would fit in a register, we should build it anyway.