[llvm-branch-commits] [llvm-branch] r214251 - Merging r213815:
Hans Wennborg
hans at hanshq.net
Tue Jul 29 16:38:59 PDT 2014
Author: hans
Date: Tue Jul 29 18:38:58 2014
New Revision: 214251
URL: http://llvm.org/viewvc/llvm-project?rev=214251&view=rev
Log:
Merging r213815:
------------------------------------------------------------------------
r213815 | mren | 2014-07-23 16:13:23 -0700 (Wed, 23 Jul 2014) | 17 lines
SimplifyCFG: fix a bug in switch to table conversion
We use gep to access the global array "switch.table", and the table index
should be treated as unsigned. When the highest bit is 1, this commit
zero-extends the index to an integer type with larger size.
For a switch on i2, we used to generate:
%switch.tableidx = sub i2 %0, -2
getelementptr inbounds [4 x i64]* @switch.table, i32 0, i2 %switch.tableidx
It is incorrect when %switch.tableidx is 2 or 3. The fix is to generate
%switch.tableidx = sub i2 %0, -2
%switch.tableidx.zext = zext i2 %switch.tableidx to i3
getelementptr inbounds [4 x i64]* @switch.table, i32 0, i3 %switch.tableidx.zext
rdar://17735071
------------------------------------------------------------------------
Added:
llvm/branches/release_35/test/Transforms/SimplifyCFG/switch-table-bug.ll
- copied unchanged from r213815, llvm/trunk/test/Transforms/SimplifyCFG/switch-table-bug.ll
Modified:
llvm/branches/release_35/ (props changed)
llvm/branches/release_35/lib/Transforms/Utils/SimplifyCFG.cpp
Propchange: llvm/branches/release_35/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jul 29 18:38:58 2014
@@ -1,3 +1,3 @@
/llvm/branches/Apple/Pertwee:110850,110961
/llvm/branches/type-system-rewrite:133420-134817
-/llvm/trunk:155241,213653,213749,213847,213894,213915
+/llvm/trunk:155241,213653,213749,213815,213847,213894,213915
Modified: llvm/branches/release_35/lib/Transforms/Utils/SimplifyCFG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_35/lib/Transforms/Utils/SimplifyCFG.cpp?rev=214251&r1=214250&r2=214251&view=diff
==============================================================================
--- llvm/branches/release_35/lib/Transforms/Utils/SimplifyCFG.cpp (original)
+++ llvm/branches/release_35/lib/Transforms/Utils/SimplifyCFG.cpp Tue Jul 29 18:38:58 2014
@@ -3477,7 +3477,7 @@ namespace {
/// BuildLookup - Build instructions with Builder to retrieve the value at
/// the position given by Index in the lookup table.
- Value *BuildLookup(Value *Index, IRBuilder<> &Builder);
+ Value *BuildLookup(Value *Index, uint64_t TableSize, IRBuilder<> &Builder);
/// WouldFitInRegister - Return true if a table with TableSize elements of
/// type ElementType would fit in a target-legal register.
@@ -3598,7 +3598,8 @@ SwitchLookupTable::SwitchLookupTable(Mod
Kind = ArrayKind;
}
-Value *SwitchLookupTable::BuildLookup(Value *Index, IRBuilder<> &Builder) {
+Value *SwitchLookupTable::BuildLookup(Value *Index, uint64_t TableSize,
+ IRBuilder<> &Builder) {
switch (Kind) {
case SingleValueKind:
return SingleValue;
@@ -3624,6 +3625,14 @@ Value *SwitchLookupTable::BuildLookup(Va
"switch.masked");
}
case ArrayKind: {
+ // Make sure the table index will not overflow when treated as signed.
+ if (IntegerType *IT = dyn_cast<IntegerType>(Index->getType()))
+ if (TableSize > (1 << (IT->getBitWidth() - 1)))
+ Index = Builder.CreateZExt(Index,
+ IntegerType::get(IT->getContext(),
+ IT->getBitWidth() + 1),
+ "switch.tableidx.zext");
+
Value *GEPIndices[] = { Builder.getInt32(0), Index };
Value *GEP = Builder.CreateInBoundsGEP(Array, GEPIndices,
"switch.gep");
@@ -3823,7 +3832,7 @@ static bool SwitchToLookupTable(SwitchIn
SI->getDefaultDest()->removePredecessor(SI->getParent());
} else {
Value *Cmp = Builder.CreateICmpULT(TableIndex, ConstantInt::get(
- MinCaseVal->getType(), TableSize));
+ MinCaseVal->getType(), TableSize));
Builder.CreateCondBr(Cmp, LookupBB, SI->getDefaultDest());
}
@@ -3878,7 +3887,7 @@ static bool SwitchToLookupTable(SwitchIn
SwitchLookupTable Table(Mod, TableSize, MinCaseVal, ResultLists[PHI],
DV, DL);
- Value *Result = Table.BuildLookup(TableIndex, Builder);
+ Value *Result = Table.BuildLookup(TableIndex, TableSize, Builder);
// If the result is used to return immediately from the function, we want to
// do that right here.
More information about the llvm-branch-commits
mailing list