diff options
| author | Chris Lattner <sabre@nondot.org> | 2009-10-23 06:50:36 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2009-10-23 06:50:36 +0000 |
| commit | 59f94c01dd726f320382daded7f4e3bb09e81690 (patch) | |
| tree | 1278459397813ef1266a93d6a095b70a9d2da5ec | |
| parent | ed00b80bf8409e200f5a713fca6cc5859c6140f6 (diff) | |
| download | bcm5719-llvm-59f94c01dd726f320382daded7f4e3bb09e81690.tar.gz bcm5719-llvm-59f94c01dd726f320382daded7f4e3bb09e81690.zip | |
enhance FoldReinterpretLoadFromConstPtr to handle loads of up to 32
bytes (i256).
llvm-svn: 84941
| -rw-r--r-- | llvm/lib/Analysis/ConstantFolding.cpp | 14 | ||||
| -rw-r--r-- | llvm/test/Transforms/ConstProp/loads.ll | 11 |
2 files changed, 19 insertions, 6 deletions
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp index 3294865a10a..30305049614 100644 --- a/llvm/lib/Analysis/ConstantFolding.cpp +++ b/llvm/lib/Analysis/ConstantFolding.cpp @@ -232,7 +232,7 @@ static Constant *FoldReinterpretLoadFromConstPtr(Constant *C, } unsigned BytesLoaded = (IntType->getBitWidth() + 7) / 8; - if (BytesLoaded > 8 || BytesLoaded == 0) return 0; + if (BytesLoaded > 32 || BytesLoaded == 0) return 0; GlobalValue *GVal; int64_t Offset; @@ -253,16 +253,18 @@ static Constant *FoldReinterpretLoadFromConstPtr(Constant *C, if (uint64_t(Offset) >= TD.getTypeAllocSize(GV->getInitializer()->getType())) return UndefValue::get(IntType); - unsigned char RawBytes[8] = {0}; + unsigned char RawBytes[32] = {0}; if (!ReadDataFromGlobal(GV->getInitializer(), Offset, RawBytes, BytesLoaded, TD)) return 0; - uint64_t ResultVal = 0; - for (unsigned i = 0; i != BytesLoaded; ++i) - ResultVal |= (uint64_t)RawBytes[i] << (i * 8); + APInt ResultVal(IntType->getBitWidth(), 0); + for (unsigned i = 0; i != BytesLoaded; ++i) { + ResultVal <<= 8; + ResultVal |= APInt(IntType->getBitWidth(), RawBytes[BytesLoaded-1-i]); + } - return ConstantInt::get(IntType, ResultVal); + return ConstantInt::get(IntType->getContext(), ResultVal); } /// ConstantFoldLoadFromConstPtr - Return the value that a load from C would diff --git a/llvm/test/Transforms/ConstProp/loads.ll b/llvm/test/Transforms/ConstProp/loads.ll index f3633cc4438..3096ed347cb 100644 --- a/llvm/test/Transforms/ConstProp/loads.ll +++ b/llvm/test/Transforms/ConstProp/loads.ll @@ -4,6 +4,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3 @test1 = constant {{i32,i8},i32} {{i32,i8} { i32 -559038737, i8 186 }, i32 -889275714 } @test2 = constant double 1.0 +@test3 = constant {i64, i64} { i64 123, i64 112312312 } ; Simple load define i32 @test1() { @@ -66,3 +67,13 @@ define double @test8() { ; @test8 ; CHECK: ret double 0xDEADBEBA } + + +; i128 load. +define i128 @test9() { + %r = load i128* bitcast({i64, i64}* @test3 to i128*) + ret i128 %r + +; @test9 +; CHECK: ret i128 112312312 +} |

