forked from OSchip/llvm-project
Minor refactoring regarding Cast::isNoopCast(), NFC
Summary: FastISel::hasTrivialKill() was the only user of the "IntPtrTy" version of Cast::isNoopCast(). According to review comments in D37894 we could instead use the "DataLayout" version of the method, and thus get rid of the "IntPtrTy" versions of isNoopCast() completely. With the above done, the remaining isNoopCast() could then be simplified a bit more. Reviewers: arsenm Reviewed By: arsenm Subscribers: wdng, llvm-commits Differential Revision: https://reviews.llvm.org/D38497 llvm-svn: 314969
This commit is contained in:
parent
8dcba551d9
commit
0ec1d25d33
|
@ -775,20 +775,10 @@ public:
|
||||||
|
|
||||||
/// A no-op cast is one that can be effected without changing any bits.
|
/// A no-op cast is one that can be effected without changing any bits.
|
||||||
/// It implies that the source and destination types are the same size. The
|
/// It implies that the source and destination types are the same size. The
|
||||||
/// IntPtrTy argument is used to make accurate determinations for casts
|
/// DataLayout argument is to determine the pointer size when examining casts
|
||||||
/// involving Integer and Pointer types. They are no-op casts if the integer
|
/// involving Integer and Pointer types. They are no-op casts if the integer
|
||||||
/// is the same size as the pointer. However, pointer size varies with
|
/// is the same size as the pointer. However, pointer size varies with
|
||||||
/// platform. Generally, the result of DataLayout::getIntPtrType() should be
|
/// platform.
|
||||||
/// passed in. If that's not available, use Type::Int64Ty, which will make
|
|
||||||
/// the isNoopCast call conservative.
|
|
||||||
/// @brief Determine if the described cast is a no-op cast.
|
|
||||||
static bool isNoopCast(
|
|
||||||
Instruction::CastOps Opcode, ///< Opcode of cast
|
|
||||||
Type *SrcTy, ///< SrcTy of cast
|
|
||||||
Type *DstTy, ///< DstTy of cast
|
|
||||||
Type *IntPtrTy ///< Integer type corresponding to Ptr types
|
|
||||||
);
|
|
||||||
|
|
||||||
/// @brief Determine if the described cast is a no-op cast.
|
/// @brief Determine if the described cast is a no-op cast.
|
||||||
static bool isNoopCast(
|
static bool isNoopCast(
|
||||||
Instruction::CastOps Opcode, ///< Opcode of cast
|
Instruction::CastOps Opcode, ///< Opcode of cast
|
||||||
|
@ -797,14 +787,9 @@ public:
|
||||||
const DataLayout &DL ///< DataLayout to get the Int Ptr type from.
|
const DataLayout &DL ///< DataLayout to get the Int Ptr type from.
|
||||||
);
|
);
|
||||||
|
|
||||||
/// @brief Determine if this cast is a no-op cast.
|
|
||||||
bool isNoopCast(
|
|
||||||
Type *IntPtrTy ///< Integer type corresponding to pointer
|
|
||||||
) const;
|
|
||||||
|
|
||||||
/// @brief Determine if this cast is a no-op cast.
|
/// @brief Determine if this cast is a no-op cast.
|
||||||
///
|
///
|
||||||
/// \param DL is the DataLayout to get the Int Ptr type from.
|
/// \param DL is the DataLayout to determine pointer size.
|
||||||
bool isNoopCast(const DataLayout &DL) const;
|
bool isNoopCast(const DataLayout &DL) const;
|
||||||
|
|
||||||
/// Determine how a pair of casts can be eliminated, if they can be at all.
|
/// Determine how a pair of casts can be eliminated, if they can be at all.
|
||||||
|
|
|
@ -168,8 +168,7 @@ bool FastISel::hasTrivialKill(const Value *V) {
|
||||||
|
|
||||||
// No-op casts are trivially coalesced by fast-isel.
|
// No-op casts are trivially coalesced by fast-isel.
|
||||||
if (const auto *Cast = dyn_cast<CastInst>(I))
|
if (const auto *Cast = dyn_cast<CastInst>(I))
|
||||||
if (Cast->isNoopCast(DL.getIntPtrType(Cast->getContext())) &&
|
if (Cast->isNoopCast(DL) && !hasTrivialKill(Cast->getOperand(0)))
|
||||||
!hasTrivialKill(Cast->getOperand(0)))
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Even the value might have only one use in the LLVM IR, it is possible that
|
// Even the value might have only one use in the LLVM IR, it is possible that
|
||||||
|
|
|
@ -2299,7 +2299,7 @@ bool CastInst::isLosslessCast() const {
|
||||||
bool CastInst::isNoopCast(Instruction::CastOps Opcode,
|
bool CastInst::isNoopCast(Instruction::CastOps Opcode,
|
||||||
Type *SrcTy,
|
Type *SrcTy,
|
||||||
Type *DestTy,
|
Type *DestTy,
|
||||||
Type *IntPtrTy) {
|
const DataLayout &DL) {
|
||||||
switch (Opcode) {
|
switch (Opcode) {
|
||||||
default: llvm_unreachable("Invalid CastOp");
|
default: llvm_unreachable("Invalid CastOp");
|
||||||
case Instruction::Trunc:
|
case Instruction::Trunc:
|
||||||
|
@ -2317,36 +2317,14 @@ bool CastInst::isNoopCast(Instruction::CastOps Opcode,
|
||||||
case Instruction::BitCast:
|
case Instruction::BitCast:
|
||||||
return true; // BitCast never modifies bits.
|
return true; // BitCast never modifies bits.
|
||||||
case Instruction::PtrToInt:
|
case Instruction::PtrToInt:
|
||||||
return IntPtrTy->getScalarSizeInBits() ==
|
return DL.getIntPtrType(SrcTy)->getScalarSizeInBits() ==
|
||||||
DestTy->getScalarSizeInBits();
|
DestTy->getScalarSizeInBits();
|
||||||
case Instruction::IntToPtr:
|
case Instruction::IntToPtr:
|
||||||
return IntPtrTy->getScalarSizeInBits() ==
|
return DL.getIntPtrType(DestTy)->getScalarSizeInBits() ==
|
||||||
SrcTy->getScalarSizeInBits();
|
SrcTy->getScalarSizeInBits();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @brief Determine if a cast is a no-op.
|
|
||||||
bool CastInst::isNoopCast(Instruction::CastOps Opcode,
|
|
||||||
Type *SrcTy,
|
|
||||||
Type *DestTy,
|
|
||||||
const DataLayout &DL) {
|
|
||||||
Type *PtrOpTy = nullptr;
|
|
||||||
if (Opcode == Instruction::PtrToInt)
|
|
||||||
PtrOpTy = SrcTy;
|
|
||||||
else if (Opcode == Instruction::IntToPtr)
|
|
||||||
PtrOpTy = DestTy;
|
|
||||||
|
|
||||||
Type *IntPtrTy = PtrOpTy ? DL.getIntPtrType(PtrOpTy) :
|
|
||||||
DL.getIntPtrType(SrcTy->getContext(), 0);
|
|
||||||
|
|
||||||
return isNoopCast(Opcode, SrcTy, DestTy, IntPtrTy);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @brief Determine if a cast is a no-op.
|
|
||||||
bool CastInst::isNoopCast(Type *IntPtrTy) const {
|
|
||||||
return isNoopCast(getOpcode(), getOperand(0)->getType(), getType(), IntPtrTy);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CastInst::isNoopCast(const DataLayout &DL) const {
|
bool CastInst::isNoopCast(const DataLayout &DL) const {
|
||||||
return isNoopCast(getOpcode(), getOperand(0)->getType(), getType(), DL);
|
return isNoopCast(getOpcode(), getOperand(0)->getType(), getType(), DL);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue