summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/InstructionSimplify.cpp
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2016-07-26 17:58:05 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2016-07-26 17:58:05 +0000
commit6774d612d4e9e0ec7a694390ba39f2d5e8b833f6 (patch)
tree662be83fe471730596cdb89ab0be885f3a0d6e99 /llvm/lib/Analysis/InstructionSimplify.cpp
parent2f2bd8caf4bc95c4f3fed59c220be87d00c4b25a (diff)
downloadbcm5719-llvm-6774d612d4e9e0ec7a694390ba39f2d5e8b833f6.tar.gz
bcm5719-llvm-6774d612d4e9e0ec7a694390ba39f2d5e8b833f6.zip
[InstSimplify] Cast folding can be made more generic
Use isEliminableCastPair to determine if a pair of casts are foldable. llvm-svn: 276777
Diffstat (limited to 'llvm/lib/Analysis/InstructionSimplify.cpp')
-rw-r--r--llvm/lib/Analysis/InstructionSimplify.cpp89
1 files changed, 43 insertions, 46 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index 8fde9c7281d..5b723e59742 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -69,8 +69,8 @@ static Value *SimplifyCmpInst(unsigned, Value *, Value *, const Query &,
unsigned);
static Value *SimplifyOrInst(Value *, Value *, const Query &, unsigned);
static Value *SimplifyXorInst(Value *, Value *, const Query &, unsigned);
-static Value *SimplifyTruncInst(Value *, Type *, const Query &, unsigned);
-static Value *SimplifyBitCastInst(Value *, Type *, const Query &, unsigned);
+static Value *SimplifyCastInst(unsigned, Value *, Type *,
+ const Query &, unsigned);
/// For a boolean type, or a vector of boolean type, return false, or
/// a vector with every element false, as appropriate for the type.
@@ -748,7 +748,8 @@ static Value *SimplifySubInst(Value *Op0, Value *Op1, bool isNSW, bool isNUW,
// See if "V === X - Y" simplifies.
if (Value *V = SimplifyBinOp(Instruction::Sub, X, Y, Q, MaxRecurse-1))
// It does! Now see if "trunc V" simplifies.
- if (Value *W = SimplifyTruncInst(V, Op0->getType(), Q, MaxRecurse-1))
+ if (Value *W = SimplifyCastInst(Instruction::Trunc, V, Op0->getType(),
+ Q, MaxRecurse - 1))
// It does, return the simplified "trunc V".
return W;
@@ -3790,49 +3791,47 @@ static Value *SimplifyPHINode(PHINode *PN, const Query &Q) {
return CommonValue;
}
-static Value *SimplifyTruncInst(Value *Op, Type *Ty, const Query &Q, unsigned) {
+static Value *SimplifyCastInst(unsigned CastOpc, Value *Op,
+ Type *Ty, const Query &Q, unsigned MaxRecurse) {
if (auto *C = dyn_cast<Constant>(Op))
- return ConstantFoldCastOperand(Instruction::Trunc, C, Ty, Q.DL);
-
- // trunc([zs]ext(x)) -> x if the trunc undoes the work of the [zs]ext.
- if (auto *CI = dyn_cast<CastInst>(Op))
- if (isa<ZExtInst>(CI) || isa<SExtInst>(CI))
- if (CI->getOperand(0)->getType() == Ty)
- return CI->getOperand(0);
-
- return nullptr;
-}
-
-Value *llvm::SimplifyTruncInst(Value *Op, Type *Ty, const DataLayout &DL,
- const TargetLibraryInfo *TLI,
- const DominatorTree *DT, AssumptionCache *AC,
- const Instruction *CxtI) {
- return ::SimplifyTruncInst(Op, Ty, Query(DL, TLI, DT, AC, CxtI),
- RecursionLimit);
-}
-
-static Value *SimplifyBitCastInst(Value *Op, Type *Ty, const Query &Q, unsigned) {
- if (auto *C = dyn_cast<Constant>(Op))
- return ConstantFoldCastOperand(Instruction::BitCast, C, Ty, Q.DL);
+ return ConstantFoldCastOperand(CastOpc, C, Ty, Q.DL);
+
+ if (auto *CI = dyn_cast<CastInst>(Op)) {
+ auto *Src = CI->getOperand(0);
+ Type *SrcTy = Src->getType();
+ Type *MidTy = CI->getType();
+ Type *DstTy = Ty;
+ if (Src->getType() == Ty) {
+ auto FirstOp = static_cast<Instruction::CastOps>(CI->getOpcode());
+ auto SecondOp = static_cast<Instruction::CastOps>(CastOpc);
+ Type *SrcIntPtrTy =
+ SrcTy->isPtrOrPtrVectorTy() ? Q.DL.getIntPtrType(SrcTy) : nullptr;
+ Type *MidIntPtrTy =
+ MidTy->isPtrOrPtrVectorTy() ? Q.DL.getIntPtrType(MidTy) : nullptr;
+ Type *DstIntPtrTy =
+ DstTy->isPtrOrPtrVectorTy() ? Q.DL.getIntPtrType(DstTy) : nullptr;
+ if (CastInst::isEliminableCastPair(FirstOp, SecondOp, SrcTy, MidTy, DstTy,
+ SrcIntPtrTy, MidIntPtrTy,
+ DstIntPtrTy) == Instruction::BitCast)
+ return Src;
+ }
+ }
// bitcast x -> x
- if (Op->getType() == Ty)
- return Op;
-
- // bitcast(bitcast x) -> x
- if (auto *BC = dyn_cast<BitCastInst>(Op))
- if (BC->getOperand(0)->getType() == Ty)
- return BC->getOperand(0);
+ if (CastOpc == Instruction::BitCast)
+ if (Op->getType() == Ty)
+ return Op;
return nullptr;
}
-Value *llvm::SimplifyBitCastInst(Value *Op, Type *Ty, const DataLayout &DL,
- const TargetLibraryInfo *TLI,
- const DominatorTree *DT, AssumptionCache *AC,
- const Instruction *CxtI) {
- return ::SimplifyBitCastInst(Op, Ty, Query(DL, TLI, DT, AC, CxtI),
- RecursionLimit);
+Value *llvm::SimplifyCastInst(unsigned CastOpc, Value *Op, Type *Ty,
+ const DataLayout &DL,
+ const TargetLibraryInfo *TLI,
+ const DominatorTree *DT, AssumptionCache *AC,
+ const Instruction *CxtI) {
+ return ::SimplifyCastInst(CastOpc, Op, Ty, Query(DL, TLI, DT, AC, CxtI),
+ RecursionLimit);
}
//=== Helper functions for higher up the class hierarchy.
@@ -4301,13 +4300,11 @@ Value *llvm::SimplifyInstruction(Instruction *I, const DataLayout &DL,
TLI, DT, AC, I);
break;
}
- case Instruction::Trunc:
- Result =
- SimplifyTruncInst(I->getOperand(0), I->getType(), DL, TLI, DT, AC, I);
- break;
- case Instruction::BitCast:
- Result =
- SimplifyBitCastInst(I->getOperand(0), I->getType(), DL, TLI, DT, AC, I);
+#define HANDLE_CAST_INST(num, opc, clas) case Instruction::opc:
+#include "llvm/IR/Instruction.def"
+#undef HANDLE_CAST_INST
+ Result = SimplifyCastInst(I->getOpcode(), I->getOperand(0), I->getType(),
+ DL, TLI, DT, AC, I);
break;
}
OpenPOWER on IntegriCloud