summaryrefslogtreecommitdiff
path: root/lib/VMCore/ConstantFold.cpp
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2006-12-04 02:46:44 +0000
committerReid Spencer <rspencer@reidspencer.com>2006-12-04 02:46:44 +0000
commit575d95ce373f1e405e6c27ce8d9f244bba3bdd0d (patch)
tree7dbef38ce90d354f1eebb43931b7ecc2d12cf74e /lib/VMCore/ConstantFold.cpp
parent56667123b7f6d6dda8b4dc178c8be4192299ae6e (diff)
downloadllvm-575d95ce373f1e405e6c27ce8d9f244bba3bdd0d.tar.gz
llvm-575d95ce373f1e405e6c27ce8d9f244bba3bdd0d.tar.bz2
llvm-575d95ce373f1e405e6c27ce8d9f244bba3bdd0d.tar.xz
Change inferred casts to explicit casts.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32165 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/ConstantFold.cpp')
-rw-r--r--lib/VMCore/ConstantFold.cpp35
1 files changed, 23 insertions, 12 deletions
diff --git a/lib/VMCore/ConstantFold.cpp b/lib/VMCore/ConstantFold.cpp
index 49bdca2c5e..ef929d7315 100644
--- a/lib/VMCore/ConstantFold.cpp
+++ b/lib/VMCore/ConstantFold.cpp
@@ -777,7 +777,8 @@ static Constant *CastConstantPacked(ConstantPacked *CP,
uint64_t V =
DoubleToBits(cast<ConstantFP>(CP->getOperand(i))->getValue());
Constant *C = ConstantInt::get(Type::ULongTy, V);
- Result.push_back(ConstantExpr::getCast(C, DstEltTy));
+ Result.push_back(
+ ConstantExpr::getInferredCast(C, false, DstEltTy, false));
}
return ConstantPacked::get(Result);
}
@@ -786,7 +787,8 @@ static Constant *CastConstantPacked(ConstantPacked *CP,
for (unsigned i = 0; i != SrcNumElts; ++i) {
uint32_t V = FloatToBits(cast<ConstantFP>(CP->getOperand(i))->getValue());
Constant *C = ConstantInt::get(Type::UIntTy, V);
- Result.push_back(ConstantExpr::getCast(C, DstEltTy));
+ Result.push_back(
+ ConstantExpr::getInferredCast(C, false, DstEltTy, false));
}
return ConstantPacked::get(Result);
}
@@ -839,8 +841,7 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, const Constant *V,
// do to try to simplify it.
if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) {
if (CE->isCast()) {
- // Try hard to fold cast of cast because they are almost always
- // eliminable.
+ // Try hard to fold cast of cast because they are often eliminable.
if (unsigned newOpc = foldConstantCastPair(opc, CE, DestTy))
return ConstantExpr::getCast(newOpc, CE->getOperand(0), DestTy);
} else if (CE->getOpcode() == Instruction::GetElementPtr) {
@@ -853,6 +854,7 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, const Constant *V,
break;
}
if (isAllNull)
+ // This is casting one pointer type to another, always BitCast
return ConstantExpr::getCast(CE->getOperand(0), DestTy);
}
}
@@ -1632,9 +1634,13 @@ Constant *llvm::ConstantFoldGetElementPtr(const Constant *C,
// gep null, C is equal to C*sizeof(nullty). If nullty is a known llvm
// type, we can statically fold this.
Constant *R = ConstantInt::get(Type::UIntTy, ElSize);
- R = ConstantExpr::getCast(R, Idx0->getType());
- R = ConstantExpr::getMul(R, Idx0);
- return ConstantExpr::getCast(R, C->getType());
+ // We know R is unsigned, Idx0 is signed because it must be an index
+ // through a sequential type (gep pointer operand) which is always
+ // signed.
+ R = ConstantExpr::getInferredCast(R, false, Idx0->getType(), true);
+ R = ConstantExpr::getMul(R, Idx0); // signed multiply
+ // R is a signed integer, C is the GEP pointer so -> IntToPtr
+ return ConstantExpr::getCast(Instruction::IntToPtr, R, C->getType());
}
}
}
@@ -1662,11 +1668,16 @@ Constant *llvm::ConstantFoldGetElementPtr(const Constant *C,
// Otherwise it must be an array.
if (!Idx0->isNullValue()) {
const Type *IdxTy = Combined->getType();
- if (IdxTy != Idx0->getType()) IdxTy = Type::LongTy;
- Combined =
- ConstantExpr::get(Instruction::Add,
- ConstantExpr::getCast(Idx0, IdxTy),
- ConstantExpr::getCast(Combined, IdxTy));
+ if (IdxTy != Idx0->getType()) {
+ Constant *C1 = ConstantExpr::getInferredCast(
+ Idx0, true, Type::LongTy, true);
+ Constant *C2 = ConstantExpr::getInferredCast(
+ Combined, true, Type::LongTy, true);
+ Combined = ConstantExpr::get(Instruction::Add, C1, C2);
+ } else {
+ Combined =
+ ConstantExpr::get(Instruction::Add, Idx0, Combined);
+ }
}
NewIndices.push_back(Combined);