enhance FoldReinterpretLoadFromConstPtr to handle loads of up to 32
bytes (i256).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84941 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/ConstantFolding.cpp b/lib/Analysis/ConstantFolding.cpp
index 3294865..3030504 100644
--- a/lib/Analysis/ConstantFolding.cpp
+++ b/lib/Analysis/ConstantFolding.cpp
@@ -232,7 +232,7 @@
}
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 @@
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/test/Transforms/ConstProp/loads.ll b/test/Transforms/ConstProp/loads.ll
index f3633cc..3096ed3 100644
--- a/test/Transforms/ConstProp/loads.ll
+++ b/test/Transforms/ConstProp/loads.ll
@@ -4,6 +4,7 @@
@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 @@
; @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
+}