aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/ConstantFolding.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-07-12 00:22:51 +0000
committerChris Lattner <sabre@nondot.org>2010-07-12 00:22:51 +0000
commitfd4a09fc0a55f4e42c699fd3e25c31ad403f8cc6 (patch)
tree56e97e13185363eb5af3985a3201040f310204dd /llvm/lib/Analysis/ConstantFolding.cpp
parentf8feba368c6b0d5a9f41a2014c245fa8d2c55bd0 (diff)
downloadllvm-fd4a09fc0a55f4e42c699fd3e25c31ad403f8cc6.zip
llvm-fd4a09fc0a55f4e42c699fd3e25c31ad403f8cc6.tar.gz
llvm-fd4a09fc0a55f4e42c699fd3e25c31ad403f8cc6.tar.bz2
fix PR7429, a crash turning a load from a string into a float.
llvm-svn: 108113
Diffstat (limited to 'llvm/lib/Analysis/ConstantFolding.cpp')
-rw-r--r--llvm/lib/Analysis/ConstantFolding.cpp12
1 files changed, 9 insertions, 3 deletions
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index 0c4d850..f7bd19d 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -436,8 +436,10 @@ Constant *llvm::ConstantFoldLoadFromConstPtr(Constant *C,
unsigned StrLen = Str.length();
const Type *Ty = cast<PointerType>(CE->getType())->getElementType();
unsigned NumBits = Ty->getPrimitiveSizeInBits();
- // Replace LI with immediate integer store.
- if ((NumBits >> 3) == StrLen + 1) {
+ // Replace load with immediate integer if the result is an integer or fp
+ // value.
+ if ((NumBits >> 3) == StrLen + 1 && (NumBits & 7) == 0 &&
+ isa<IntegerType>(Ty) || Ty->isFloatingPointTy()) {
APInt StrVal(NumBits, 0);
APInt SingleChar(NumBits, 0);
if (TD->isLittleEndian()) {
@@ -454,7 +456,11 @@ Constant *llvm::ConstantFoldLoadFromConstPtr(Constant *C,
SingleChar = 0;
StrVal = (StrVal << 8) | SingleChar;
}
- return ConstantInt::get(CE->getContext(), StrVal);
+
+ Constant *Res = ConstantInt::get(CE->getContext(), StrVal);
+ if (Ty->isFloatingPointTy())
+ Res = ConstantExpr::getBitCast(Res, Ty);
+ return Res;
}
}