summaryrefslogtreecommitdiffstats
path: root/llvm/lib/VMCore/Instructions.cpp
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2006-12-04 02:43:42 +0000
committerReid Spencer <rspencer@reidspencer.com>2006-12-04 02:43:42 +0000
commitc4dacf24553383b975de34ec44485141c47863df (patch)
treebcb8da386fb996ee3a977739750cc9f64cc6c47e /llvm/lib/VMCore/Instructions.cpp
parent3c3fed62bf90d3801bf146b6fc5136b56f3df44a (diff)
downloadbcm5719-llvm-c4dacf24553383b975de34ec44485141c47863df.tar.gz
bcm5719-llvm-c4dacf24553383b975de34ec44485141c47863df.zip
Take a baby step towards getting rid of inferred casts. Provide methods on
CastInst and ConstantExpr that allow the signedness to be explicitly passed in and reliance on signedness removed from getCastOpcode. These are temporary measures useful during the conversion of inferred casts. llvm-svn: 32164
Diffstat (limited to 'llvm/lib/VMCore/Instructions.cpp')
-rw-r--r--llvm/lib/VMCore/Instructions.cpp23
1 files changed, 19 insertions, 4 deletions
diff --git a/llvm/lib/VMCore/Instructions.cpp b/llvm/lib/VMCore/Instructions.cpp
index f4866423176..de1ebced7bc 100644
--- a/llvm/lib/VMCore/Instructions.cpp
+++ b/llvm/lib/VMCore/Instructions.cpp
@@ -1507,7 +1507,8 @@ CastInst *CastInst::create(Instruction::CastOps op, Value *S, const Type *Ty,
// should not assert in checkCast. In other words, this produces a "correct"
// casting opcode for the arguments passed to it.
Instruction::CastOps
-CastInst::getCastOpcode(const Value *Src, const Type *DestTy) {
+CastInst::getCastOpcode(
+ const Value *Src, bool SrcIsSigned, const Type *DestTy, bool DestIsSigned) {
// Get the bit sizes, we'll need these
const Type *SrcTy = Src->getType();
unsigned SrcBits = SrcTy->getPrimitiveSizeInBits(); // 0 for ptr/packed
@@ -1519,7 +1520,7 @@ CastInst::getCastOpcode(const Value *Src, const Type *DestTy) {
if (DestBits < SrcBits)
return Trunc; // int -> smaller int
else if (DestBits > SrcBits) { // its an extension
- if (SrcTy->isSigned())
+ if (SrcIsSigned)
return SExt; // signed -> SEXT
else
return ZExt; // unsigned -> ZEXT
@@ -1527,7 +1528,7 @@ CastInst::getCastOpcode(const Value *Src, const Type *DestTy) {
return BitCast; // Same size, No-op cast
}
} else if (SrcTy->isFloatingPoint()) { // Casting from floating pt
- if (DestTy->isSigned())
+ if (DestIsSigned)
return FPToSI; // FP -> sint
else
return FPToUI; // FP -> uint
@@ -1542,7 +1543,7 @@ CastInst::getCastOpcode(const Value *Src, const Type *DestTy) {
}
} else if (DestTy->isFloatingPoint()) { // Casting to floating pt
if (SrcTy->isIntegral()) { // Casting from integral
- if (SrcTy->isSigned())
+ if (SrcIsSigned)
return SIToFP; // sint -> FP
else
return UIToFP; // uint -> FP
@@ -1649,6 +1650,20 @@ checkCast(Instruction::CastOps op, Value *S, const Type *DstTy) {
}
}
+CastInst *CastInst::createInferredCast(
+ Value *S, const Type *Ty, const std::string &Name, Instruction *InsertBefore)
+{
+ return createInferredCast(S, S->getType()->isSigned(), Ty, Ty->isSigned(),
+ Name, InsertBefore);
+}
+
+CastInst *CastInst::createInferredCast(
+ Value *S, const Type *Ty, const std::string &Name, BasicBlock *InsertAtEnd)
+{
+ return createInferredCast(S, S->getType()->isSigned(), Ty, Ty->isSigned(),
+ Name, InsertAtEnd);
+}
+
TruncInst::TruncInst(
Value *S, const Type *Ty, const std::string &Name, Instruction *InsertBefore
) : CastInst(Ty, Trunc, S, Name, InsertBefore) {
OpenPOWER on IntegriCloud