aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/llvm/Constants.h9
-rw-r--r--include/llvm/InstrTypes.h27
2 files changed, 32 insertions, 4 deletions
diff --git a/include/llvm/Constants.h b/include/llvm/Constants.h
index 06aaca6..3359138 100644
--- a/include/llvm/Constants.h
+++ b/include/llvm/Constants.h
@@ -541,8 +541,15 @@ public:
const Type *Ty ///< The type to which the constant is converted
);
+ // This method uses the CastInst::getCastOpcode method to infer the
+ // cast opcode to use.
// @brief Get a ConstantExpr Conversion operator that casts C to Ty
- static Constant *getCast(Constant *C, const Type *Ty);
+ static Constant *getInferredCast(Constant *C, bool SrcIsSigned,
+ const Type *Ty, bool DestIsSigned);
+
+ static Constant *getCast(Constant *C, const Type *Ty) {
+ return getInferredCast(C, C->getType()->isSigned(), Ty, Ty->isSigned());
+ }
/// @brief Return true if this is a convert constant expression
bool isCast() const;
diff --git a/include/llvm/InstrTypes.h b/include/llvm/InstrTypes.h
index 0a489f3..07d13da 100644
--- a/include/llvm/InstrTypes.h
+++ b/include/llvm/InstrTypes.h
@@ -303,7 +303,9 @@ public:
/// rules.
static Instruction::CastOps getCastOpcode(
const Value *Val, ///< The value to cast
- const Type *Ty ///< The Type to which the value should be casted
+ bool SrcIsSigned, ///< Whether to treat the source as signed
+ const Type *Ty, ///< The Type to which the value should be casted
+ bool DstIsSigned ///< Whether to treate the dest. as signed
);
/// Joins the create method (with insert-before-instruction semantics) above
@@ -316,12 +318,21 @@ public:
/// @brief Inline helper method to join create with getCastOpcode.
inline static CastInst *createInferredCast(
Value *S, ///< The value to be casted (operand 0)
+ bool SrcIsSigned, ///< Whether to treat the source as signed
const Type *Ty, ///< Type to which operand should be casted
+ bool DstIsSigned, ///< Whether to treate the dest. as signed
const std::string &Name = "", ///< Name for the instruction
Instruction *InsertBefore = 0 ///< Place to insert the CastInst
) {
- return create(getCastOpcode(S, Ty), S, Ty, Name, InsertBefore);
+ return create(getCastOpcode(S, SrcIsSigned, Ty, DstIsSigned),
+ S, Ty, Name, InsertBefore);
}
+ static CastInst *createInferredCast(
+ Value *S, ///< The value to be casted (operand 0)
+ const Type *Ty, ///< Type to which operand should be casted
+ const std::string &Name = "", ///< Name for the instruction
+ Instruction *InsertBefore = 0 ///< Place to insert the CastInst
+ );
/// Joins the get method (with insert-at-end-of-block semantics) method
/// above with the getCastOpcode method. getOpcode(S,Ty) is called first to
@@ -334,13 +345,23 @@ public:
/// @brief Inline helper method to join create with getCastOpcode.
inline static CastInst *createInferredCast(
Value *S, ///< The value to be casted (operand 0)
+ bool SrcIsSigned, ///< Whether to treat the source as signed
const Type *Ty, ///< Type to which operand should be casted
+ bool DstIsSigned, ///< Whether to treate the dest. as signed
const std::string &Name, ///< Name for the instruction
BasicBlock *InsertAtEnd ///< The block to insert the instruction into
) {
- return create(getCastOpcode(S, Ty), S, Ty, Name, InsertAtEnd);
+ return create(getCastOpcode(S, SrcIsSigned, Ty, DstIsSigned),
+ S, Ty, Name, InsertAtEnd);
}
+ static CastInst *createInferredCast(
+ Value *S, ///< The value to be casted (operand 0)
+ const Type *Ty, ///< Type to which operand should be casted
+ const std::string &Name, ///< Name for the instruction
+ BasicBlock *InsertAtEnd ///< The block to insert the instruction into
+ );
+
/// There are several places where we need to know if a cast instruction
/// only deals with integer source and destination types. To simplify that
/// logic, this method is provided.