diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2016-08-05 14:55:02 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2016-08-05 14:55:02 +0000 |
commit | aa160c22f73df256b157516f381a86eb23cd568c (patch) | |
tree | eb27bbb46008cbb0b0f5cb1c5d5217c465b6f066 /llvm/lib/Transforms/Utils/SimplifyCFG.cpp | |
parent | 5a9b9f98c0918bb2a5efdf621ef4552bff3ff463 (diff) | |
download | llvm-aa160c22f73df256b157516f381a86eb23cd568c.zip llvm-aa160c22f73df256b157516f381a86eb23cd568c.tar.gz llvm-aa160c22f73df256b157516f381a86eb23cd568c.tar.bz2 |
[SimplifyCFG] Make range reduction code deterministic.
This generated IR based on the order of evaluation, which is different
between GCC and Clang. With that in mind you get bootstrap miscompares
if you compare a Clang built with GCC-built Clang vs. Clang built with
Clang-built Clang. Diagnosing that made my head hurt.
This also reverts commit r277337, which "fixed" the test case.
llvm-svn: 277820
Diffstat (limited to 'llvm/lib/Transforms/Utils/SimplifyCFG.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index 32060fa..f3bea40 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -5128,8 +5128,9 @@ static bool ReduceSwitchRange(SwitchInst *SI, IRBuilder<> &Builder, Builder.SetInsertPoint(SI); auto *ShiftC = ConstantInt::get(Ty, Shift); auto *Sub = Builder.CreateSub(SI->getCondition(), ConstantInt::get(Ty, Base)); - auto *Rot = Builder.CreateOr(Builder.CreateLShr(Sub, ShiftC), - Builder.CreateShl(Sub, Ty->getBitWidth() - Shift)); + auto *LShr = Builder.CreateLShr(Sub, ShiftC); + auto *Shl = Builder.CreateShl(Sub, Ty->getBitWidth() - Shift); + auto *Rot = Builder.CreateOr(LShr, Shl); SI->replaceUsesOfWith(SI->getCondition(), Rot); for (SwitchInst::CaseIt C = SI->case_begin(), E = SI->case_end(); C != E; |