summaryrefslogtreecommitdiff
path: root/lib/Transforms/Utils/SimplifyCFG.cpp
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2012-11-30 09:34:29 +0000
committerChandler Carruth <chandlerc@gmail.com>2012-11-30 09:34:29 +0000
commit66ea2f99867ffc8606737199e359516fd1cfc67c (patch)
tree0feab8c92f080884cd3c3823f59a57144a287c82 /lib/Transforms/Utils/SimplifyCFG.cpp
parent06ec7211c17a4b45a943c36e0fb3d6715aa2453d (diff)
downloadllvm-66ea2f99867ffc8606737199e359516fd1cfc67c.tar.gz
llvm-66ea2f99867ffc8606737199e359516fd1cfc67c.tar.bz2
llvm-66ea2f99867ffc8606737199e359516fd1cfc67c.tar.xz
Fix non-determinism introduced in r168970 and pointed out by Duncan.
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
Diffstat (limited to 'lib/Transforms/Utils/SimplifyCFG.cpp')
-rw-r--r--lib/Transforms/Utils/SimplifyCFG.cpp18
1 files changed, 13 insertions, 5 deletions
diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp
index 5a1b21025c..f6d43a9e6c 100644
--- a/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -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.