mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
Propagate TargetLibraryInfo throughout ConstantFolding.cpp and
InstructionSimplify.cpp. Other fixups as needed. Part of rdar://10500969 llvm-svn: 145559
This commit is contained in:
parent
4047e7c476
commit
49a66381f7
@ -25,6 +25,7 @@ namespace llvm {
|
||||
class ConstantExpr;
|
||||
class Instruction;
|
||||
class TargetData;
|
||||
class TargetLibraryInfo;
|
||||
class Function;
|
||||
class Type;
|
||||
template<typename T>
|
||||
@ -35,13 +36,15 @@ namespace llvm {
|
||||
/// Note that this fails if not all of the operands are constant. Otherwise,
|
||||
/// this function can only fail when attempting to fold instructions like loads
|
||||
/// and stores, which have no constant expression form.
|
||||
Constant *ConstantFoldInstruction(Instruction *I, const TargetData *TD = 0);
|
||||
Constant *ConstantFoldInstruction(Instruction *I, const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0);
|
||||
|
||||
/// ConstantFoldConstantExpression - Attempt to fold the constant expression
|
||||
/// using the specified TargetData. If successful, the constant result is
|
||||
/// result is returned, if not, null is returned.
|
||||
Constant *ConstantFoldConstantExpression(const ConstantExpr *CE,
|
||||
const TargetData *TD = 0);
|
||||
const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0);
|
||||
|
||||
/// ConstantFoldInstOperands - Attempt to constant fold an instruction with the
|
||||
/// specified operands. If successful, the constant result is returned, if not,
|
||||
@ -51,7 +54,8 @@ Constant *ConstantFoldConstantExpression(const ConstantExpr *CE,
|
||||
///
|
||||
Constant *ConstantFoldInstOperands(unsigned Opcode, Type *DestTy,
|
||||
ArrayRef<Constant *> Ops,
|
||||
const TargetData *TD = 0);
|
||||
const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0);
|
||||
|
||||
/// ConstantFoldCompareInstOperands - Attempt to constant fold a compare
|
||||
/// instruction (icmp/fcmp) with the specified operands. If it fails, it
|
||||
@ -59,7 +63,8 @@ Constant *ConstantFoldInstOperands(unsigned Opcode, Type *DestTy,
|
||||
///
|
||||
Constant *ConstantFoldCompareInstOperands(unsigned Predicate,
|
||||
Constant *LHS, Constant *RHS,
|
||||
const TargetData *TD = 0);
|
||||
const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0);
|
||||
|
||||
/// ConstantFoldInsertValueInstruction - Attempt to constant fold an insertvalue
|
||||
/// instruction with the specified operands and indices. The constant result is
|
||||
@ -83,8 +88,8 @@ bool canConstantFoldCallTo(const Function *F);
|
||||
|
||||
/// ConstantFoldCall - Attempt to constant fold a call to the specified function
|
||||
/// with the specified arguments, returning null if unsuccessful.
|
||||
Constant *
|
||||
ConstantFoldCall(Function *F, ArrayRef<Constant *> Operands);
|
||||
Constant *ConstantFoldCall(Function *F, ArrayRef<Constant *> Operands,
|
||||
const TargetLibraryInfo *TLI = 0);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -24,95 +24,117 @@ namespace llvm {
|
||||
class Instruction;
|
||||
class Value;
|
||||
class TargetData;
|
||||
class TargetLibraryInfo;
|
||||
template<typename T>
|
||||
class ArrayRef;
|
||||
|
||||
/// SimplifyAddInst - Given operands for an Add, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifyAddInst(Value *LHS, Value *RHS, bool isNSW, bool isNUW,
|
||||
const TargetData *TD = 0, const DominatorTree *DT = 0);
|
||||
const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0,
|
||||
const DominatorTree *DT = 0);
|
||||
|
||||
/// SimplifySubInst - Given operands for a Sub, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifySubInst(Value *LHS, Value *RHS, bool isNSW, bool isNUW,
|
||||
const TargetData *TD = 0, const DominatorTree *DT = 0);
|
||||
const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0,
|
||||
const DominatorTree *DT = 0);
|
||||
|
||||
/// SimplifyMulInst - Given operands for a Mul, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifyMulInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0,
|
||||
const DominatorTree *DT = 0);
|
||||
|
||||
/// SimplifySDivInst - Given operands for an SDiv, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifySDivInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0,
|
||||
const DominatorTree *DT = 0);
|
||||
|
||||
/// SimplifyUDivInst - Given operands for a UDiv, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifyUDivInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
|
||||
Value *SimplifyUDivInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0,
|
||||
const DominatorTree *DT = 0);
|
||||
|
||||
/// SimplifyFDivInst - Given operands for an FDiv, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifyFDivInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0,
|
||||
const DominatorTree *DT = 0);
|
||||
|
||||
/// SimplifySRemInst - Given operands for an SRem, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifySRemInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
|
||||
Value *SimplifySRemInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0,
|
||||
const DominatorTree *DT = 0);
|
||||
|
||||
/// SimplifyURemInst - Given operands for a URem, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifyURemInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0,
|
||||
const DominatorTree *DT = 0);
|
||||
|
||||
/// SimplifyFRemInst - Given operands for an FRem, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifyFRemInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0,
|
||||
const DominatorTree *DT = 0);
|
||||
|
||||
/// SimplifyShlInst - Given operands for a Shl, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifyShlInst(Value *Op0, Value *Op1, bool isNSW, bool isNUW,
|
||||
const TargetData *TD = 0, const DominatorTree *DT = 0);
|
||||
const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0,
|
||||
const DominatorTree *DT = 0);
|
||||
|
||||
/// SimplifyLShrInst - Given operands for a LShr, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifyLShrInst(Value *Op0, Value *Op1, bool isExact,
|
||||
const TargetData *TD = 0, const DominatorTree *DT=0);
|
||||
const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0,
|
||||
const DominatorTree *DT = 0);
|
||||
|
||||
/// SimplifyAShrInst - Given operands for a AShr, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifyAShrInst(Value *Op0, Value *Op1, bool isExact,
|
||||
const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0,
|
||||
const DominatorTree *DT = 0);
|
||||
|
||||
/// SimplifyAndInst - Given operands for an And, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifyAndInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0,
|
||||
const DominatorTree *DT = 0);
|
||||
|
||||
/// SimplifyOrInst - Given operands for an Or, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifyOrInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0,
|
||||
const DominatorTree *DT = 0);
|
||||
|
||||
/// SimplifyXorInst - Given operands for a Xor, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifyXorInst(Value *LHS, Value *RHS, const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0,
|
||||
const DominatorTree *DT = 0);
|
||||
|
||||
/// SimplifyICmpInst - Given operands for an ICmpInst, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
|
||||
const TargetData *TD = 0,
|
||||
const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0,
|
||||
const DominatorTree *DT = 0);
|
||||
|
||||
/// SimplifyFCmpInst - Given operands for an FCmpInst, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
|
||||
const TargetData *TD = 0,
|
||||
const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0,
|
||||
const DominatorTree *DT = 0);
|
||||
|
||||
/// SimplifySelectInst - Given operands for a SelectInst, see if we can fold
|
||||
@ -123,8 +145,8 @@ namespace llvm {
|
||||
|
||||
/// SimplifyGEPInst - Given operands for an GetElementPtrInst, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifyGEPInst(ArrayRef<Value *> Ops,
|
||||
const TargetData *TD = 0, const DominatorTree *DT = 0);
|
||||
Value *SimplifyGEPInst(ArrayRef<Value *> Ops, const TargetData *TD = 0,
|
||||
const DominatorTree *DT = 0);
|
||||
|
||||
/// SimplifyInsertValueInst - Given operands for an InsertValueInst, see if we
|
||||
/// can fold the result. If not, this returns null.
|
||||
@ -139,16 +161,21 @@ namespace llvm {
|
||||
/// SimplifyCmpInst - Given operands for a CmpInst, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifyCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
|
||||
const TargetData *TD = 0, const DominatorTree *DT = 0);
|
||||
const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0,
|
||||
const DominatorTree *DT = 0);
|
||||
|
||||
/// SimplifyBinOp - Given operands for a BinaryOperator, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS,
|
||||
const TargetData *TD = 0, const DominatorTree *DT = 0);
|
||||
const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0,
|
||||
const DominatorTree *DT = 0);
|
||||
|
||||
/// SimplifyInstruction - See if we can compute a simplified version of this
|
||||
/// instruction. If not, this returns null.
|
||||
Value *SimplifyInstruction(Instruction *I, const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0,
|
||||
const DominatorTree *DT = 0);
|
||||
|
||||
|
||||
@ -160,6 +187,7 @@ namespace llvm {
|
||||
///
|
||||
void ReplaceAndSimplifyAllUses(Instruction *From, Value *To,
|
||||
const TargetData *TD = 0,
|
||||
const TargetLibraryInfo *TLI = 0,
|
||||
const DominatorTree *DT = 0);
|
||||
} // end namespace llvm
|
||||
|
||||
|
@ -20,7 +20,8 @@
|
||||
namespace llvm {
|
||||
class DominatorTree;
|
||||
class TargetData;
|
||||
|
||||
class TargetLibraryInfo;
|
||||
|
||||
/// PHITransAddr - An address value which tracks and handles phi translation.
|
||||
/// As we walk "up" the CFG through predecessors, we need to ensure that the
|
||||
/// address we're tracking is kept up to date. For example, if we're analyzing
|
||||
@ -37,11 +38,14 @@ class PHITransAddr {
|
||||
|
||||
/// TD - The target data we are playing with if known, otherwise null.
|
||||
const TargetData *TD;
|
||||
|
||||
/// TLI - The target library info if known, otherwise null.
|
||||
const TargetLibraryInfo *TLI;
|
||||
|
||||
/// InstInputs - The inputs for our symbolic address.
|
||||
SmallVector<Instruction*, 4> InstInputs;
|
||||
public:
|
||||
PHITransAddr(Value *addr, const TargetData *td) : Addr(addr), TD(td) {
|
||||
PHITransAddr(Value *addr, const TargetData *td) : Addr(addr), TD(td), TLI(0) {
|
||||
// If the address is an instruction, the whole thing is considered an input.
|
||||
if (Instruction *I = dyn_cast<Instruction>(Addr))
|
||||
InstInputs.push_back(I);
|
||||
|
@ -41,6 +41,7 @@ namespace llvm {
|
||||
class Type;
|
||||
class ScalarEvolution;
|
||||
class TargetData;
|
||||
class TargetLibraryInfo;
|
||||
class LLVMContext;
|
||||
class Loop;
|
||||
class LoopInfo;
|
||||
@ -224,6 +225,10 @@ namespace llvm {
|
||||
///
|
||||
TargetData *TD;
|
||||
|
||||
/// TLI - The target library information for the target we are targeting.
|
||||
///
|
||||
TargetLibraryInfo *TLI;
|
||||
|
||||
/// DT - The dominator tree.
|
||||
///
|
||||
DominatorTree *DT;
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "llvm/Operator.h"
|
||||
#include "llvm/Analysis/ValueTracking.h"
|
||||
#include "llvm/Target/TargetData.h"
|
||||
#include "llvm/Target/TargetLibraryInfo.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/StringMap.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
@ -542,8 +543,8 @@ static Constant *SymbolicallyEvaluateBinop(unsigned Opc, Constant *Op0,
|
||||
/// explicitly cast them so that they aren't implicitly casted by the
|
||||
/// getelementptr.
|
||||
static Constant *CastGEPIndices(ArrayRef<Constant *> Ops,
|
||||
Type *ResultTy,
|
||||
const TargetData *TD) {
|
||||
Type *ResultTy, const TargetData *TD,
|
||||
const TargetLibraryInfo *TLI) {
|
||||
if (!TD) return 0;
|
||||
Type *IntPtrTy = TD->getIntPtrType(ResultTy->getContext());
|
||||
|
||||
@ -568,7 +569,7 @@ static Constant *CastGEPIndices(ArrayRef<Constant *> Ops,
|
||||
Constant *C =
|
||||
ConstantExpr::getGetElementPtr(Ops[0], NewIdxs);
|
||||
if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C))
|
||||
if (Constant *Folded = ConstantFoldConstantExpression(CE, TD))
|
||||
if (Constant *Folded = ConstantFoldConstantExpression(CE, TD, TLI))
|
||||
C = Folded;
|
||||
return C;
|
||||
}
|
||||
@ -576,8 +577,8 @@ static Constant *CastGEPIndices(ArrayRef<Constant *> Ops,
|
||||
/// SymbolicallyEvaluateGEP - If we can symbolically evaluate the specified GEP
|
||||
/// constant expression, do so.
|
||||
static Constant *SymbolicallyEvaluateGEP(ArrayRef<Constant *> Ops,
|
||||
Type *ResultTy,
|
||||
const TargetData *TD) {
|
||||
Type *ResultTy, const TargetData *TD,
|
||||
const TargetLibraryInfo *TLI) {
|
||||
Constant *Ptr = Ops[0];
|
||||
if (!TD || !cast<PointerType>(Ptr->getType())->getElementType()->isSized())
|
||||
return 0;
|
||||
@ -602,7 +603,7 @@ static Constant *SymbolicallyEvaluateGEP(ArrayRef<Constant *> Ops,
|
||||
Res = ConstantExpr::getSub(Res, CE->getOperand(1));
|
||||
Res = ConstantExpr::getIntToPtr(Res, ResultTy);
|
||||
if (ConstantExpr *ResCE = dyn_cast<ConstantExpr>(Res))
|
||||
Res = ConstantFoldConstantExpression(ResCE, TD);
|
||||
Res = ConstantFoldConstantExpression(ResCE, TD, TLI);
|
||||
return Res;
|
||||
}
|
||||
}
|
||||
@ -729,7 +730,9 @@ static Constant *SymbolicallyEvaluateGEP(ArrayRef<Constant *> Ops,
|
||||
/// Note that this fails if not all of the operands are constant. Otherwise,
|
||||
/// this function can only fail when attempting to fold instructions like loads
|
||||
/// and stores, which have no constant expression form.
|
||||
Constant *llvm::ConstantFoldInstruction(Instruction *I, const TargetData *TD) {
|
||||
Constant *llvm::ConstantFoldInstruction(Instruction *I,
|
||||
const TargetData *TD,
|
||||
const TargetLibraryInfo *TLI) {
|
||||
// Handle PHI nodes quickly here...
|
||||
if (PHINode *PN = dyn_cast<PHINode>(I)) {
|
||||
Constant *CommonValue = 0;
|
||||
@ -765,7 +768,7 @@ Constant *llvm::ConstantFoldInstruction(Instruction *I, const TargetData *TD) {
|
||||
|
||||
if (const CmpInst *CI = dyn_cast<CmpInst>(I))
|
||||
return ConstantFoldCompareInstOperands(CI->getPredicate(), Ops[0], Ops[1],
|
||||
TD);
|
||||
TD, TLI);
|
||||
|
||||
if (const LoadInst *LI = dyn_cast<LoadInst>(I))
|
||||
return ConstantFoldLoadInst(LI, TD);
|
||||
@ -781,28 +784,29 @@ Constant *llvm::ConstantFoldInstruction(Instruction *I, const TargetData *TD) {
|
||||
cast<Constant>(EVI->getAggregateOperand()),
|
||||
EVI->getIndices());
|
||||
|
||||
return ConstantFoldInstOperands(I->getOpcode(), I->getType(), Ops, TD);
|
||||
return ConstantFoldInstOperands(I->getOpcode(), I->getType(), Ops, TD, TLI);
|
||||
}
|
||||
|
||||
/// ConstantFoldConstantExpression - Attempt to fold the constant expression
|
||||
/// using the specified TargetData. If successful, the constant result is
|
||||
/// result is returned, if not, null is returned.
|
||||
Constant *llvm::ConstantFoldConstantExpression(const ConstantExpr *CE,
|
||||
const TargetData *TD) {
|
||||
const TargetData *TD,
|
||||
const TargetLibraryInfo *TLI) {
|
||||
SmallVector<Constant*, 8> Ops;
|
||||
for (User::const_op_iterator i = CE->op_begin(), e = CE->op_end();
|
||||
i != e; ++i) {
|
||||
Constant *NewC = cast<Constant>(*i);
|
||||
// Recursively fold the ConstantExpr's operands.
|
||||
if (ConstantExpr *NewCE = dyn_cast<ConstantExpr>(NewC))
|
||||
NewC = ConstantFoldConstantExpression(NewCE, TD);
|
||||
NewC = ConstantFoldConstantExpression(NewCE, TD, TLI);
|
||||
Ops.push_back(NewC);
|
||||
}
|
||||
|
||||
if (CE->isCompare())
|
||||
return ConstantFoldCompareInstOperands(CE->getPredicate(), Ops[0], Ops[1],
|
||||
TD);
|
||||
return ConstantFoldInstOperands(CE->getOpcode(), CE->getType(), Ops, TD);
|
||||
TD, TLI);
|
||||
return ConstantFoldInstOperands(CE->getOpcode(), CE->getType(), Ops, TD, TLI);
|
||||
}
|
||||
|
||||
/// ConstantFoldInstOperands - Attempt to constant fold an instruction with the
|
||||
@ -817,7 +821,8 @@ Constant *llvm::ConstantFoldConstantExpression(const ConstantExpr *CE,
|
||||
///
|
||||
Constant *llvm::ConstantFoldInstOperands(unsigned Opcode, Type *DestTy,
|
||||
ArrayRef<Constant *> Ops,
|
||||
const TargetData *TD) {
|
||||
const TargetData *TD,
|
||||
const TargetLibraryInfo *TLI) {
|
||||
// Handle easy binops first.
|
||||
if (Instruction::isBinaryOp(Opcode)) {
|
||||
if (isa<ConstantExpr>(Ops[0]) || isa<ConstantExpr>(Ops[1]))
|
||||
@ -834,7 +839,7 @@ Constant *llvm::ConstantFoldInstOperands(unsigned Opcode, Type *DestTy,
|
||||
case Instruction::Call:
|
||||
if (Function *F = dyn_cast<Function>(Ops.back()))
|
||||
if (canConstantFoldCallTo(F))
|
||||
return ConstantFoldCall(F, Ops.slice(0, Ops.size() - 1));
|
||||
return ConstantFoldCall(F, Ops.slice(0, Ops.size() - 1), TLI);
|
||||
return 0;
|
||||
case Instruction::PtrToInt:
|
||||
// If the input is a inttoptr, eliminate the pair. This requires knowing
|
||||
@ -888,9 +893,9 @@ Constant *llvm::ConstantFoldInstOperands(unsigned Opcode, Type *DestTy,
|
||||
case Instruction::ShuffleVector:
|
||||
return ConstantExpr::getShuffleVector(Ops[0], Ops[1], Ops[2]);
|
||||
case Instruction::GetElementPtr:
|
||||
if (Constant *C = CastGEPIndices(Ops, DestTy, TD))
|
||||
if (Constant *C = CastGEPIndices(Ops, DestTy, TD, TLI))
|
||||
return C;
|
||||
if (Constant *C = SymbolicallyEvaluateGEP(Ops, DestTy, TD))
|
||||
if (Constant *C = SymbolicallyEvaluateGEP(Ops, DestTy, TD, TLI))
|
||||
return C;
|
||||
|
||||
return ConstantExpr::getGetElementPtr(Ops[0], Ops.slice(1));
|
||||
@ -903,7 +908,8 @@ Constant *llvm::ConstantFoldInstOperands(unsigned Opcode, Type *DestTy,
|
||||
///
|
||||
Constant *llvm::ConstantFoldCompareInstOperands(unsigned Predicate,
|
||||
Constant *Ops0, Constant *Ops1,
|
||||
const TargetData *TD) {
|
||||
const TargetData *TD,
|
||||
const TargetLibraryInfo *TLI) {
|
||||
// fold: icmp (inttoptr x), null -> icmp x, 0
|
||||
// fold: icmp (ptrtoint x), 0 -> icmp x, null
|
||||
// fold: icmp (inttoptr x), (inttoptr y) -> icmp trunc/zext x, trunc/zext y
|
||||
@ -920,7 +926,7 @@ Constant *llvm::ConstantFoldCompareInstOperands(unsigned Predicate,
|
||||
Constant *C = ConstantExpr::getIntegerCast(CE0->getOperand(0),
|
||||
IntPtrTy, false);
|
||||
Constant *Null = Constant::getNullValue(C->getType());
|
||||
return ConstantFoldCompareInstOperands(Predicate, C, Null, TD);
|
||||
return ConstantFoldCompareInstOperands(Predicate, C, Null, TD, TLI);
|
||||
}
|
||||
|
||||
// Only do this transformation if the int is intptrty in size, otherwise
|
||||
@ -929,7 +935,7 @@ Constant *llvm::ConstantFoldCompareInstOperands(unsigned Predicate,
|
||||
CE0->getType() == IntPtrTy) {
|
||||
Constant *C = CE0->getOperand(0);
|
||||
Constant *Null = Constant::getNullValue(C->getType());
|
||||
return ConstantFoldCompareInstOperands(Predicate, C, Null, TD);
|
||||
return ConstantFoldCompareInstOperands(Predicate, C, Null, TD, TLI);
|
||||
}
|
||||
}
|
||||
|
||||
@ -944,7 +950,7 @@ Constant *llvm::ConstantFoldCompareInstOperands(unsigned Predicate,
|
||||
IntPtrTy, false);
|
||||
Constant *C1 = ConstantExpr::getIntegerCast(CE1->getOperand(0),
|
||||
IntPtrTy, false);
|
||||
return ConstantFoldCompareInstOperands(Predicate, C0, C1, TD);
|
||||
return ConstantFoldCompareInstOperands(Predicate, C0, C1, TD, TLI);
|
||||
}
|
||||
|
||||
// Only do this transformation if the int is intptrty in size, otherwise
|
||||
@ -953,7 +959,7 @@ Constant *llvm::ConstantFoldCompareInstOperands(unsigned Predicate,
|
||||
CE0->getType() == IntPtrTy &&
|
||||
CE0->getOperand(0)->getType() == CE1->getOperand(0)->getType()))
|
||||
return ConstantFoldCompareInstOperands(Predicate, CE0->getOperand(0),
|
||||
CE1->getOperand(0), TD);
|
||||
CE1->getOperand(0), TD, TLI);
|
||||
}
|
||||
}
|
||||
|
||||
@ -962,13 +968,15 @@ Constant *llvm::ConstantFoldCompareInstOperands(unsigned Predicate,
|
||||
if ((Predicate == ICmpInst::ICMP_EQ || Predicate == ICmpInst::ICMP_NE) &&
|
||||
CE0->getOpcode() == Instruction::Or && Ops1->isNullValue()) {
|
||||
Constant *LHS =
|
||||
ConstantFoldCompareInstOperands(Predicate, CE0->getOperand(0), Ops1,TD);
|
||||
ConstantFoldCompareInstOperands(Predicate, CE0->getOperand(0), Ops1,
|
||||
TD, TLI);
|
||||
Constant *RHS =
|
||||
ConstantFoldCompareInstOperands(Predicate, CE0->getOperand(1), Ops1,TD);
|
||||
ConstantFoldCompareInstOperands(Predicate, CE0->getOperand(1), Ops1,
|
||||
TD, TLI);
|
||||
unsigned OpC =
|
||||
Predicate == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
|
||||
Constant *Ops[] = { LHS, RHS };
|
||||
return ConstantFoldInstOperands(OpC, LHS->getType(), Ops, TD);
|
||||
return ConstantFoldInstOperands(OpC, LHS->getType(), Ops, TD, TLI);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1168,7 +1176,8 @@ static Constant *ConstantFoldConvertToInt(ConstantFP *Op, bool roundTowardZero,
|
||||
/// ConstantFoldCall - Attempt to constant fold a call to the specified function
|
||||
/// with the specified arguments, returning null if unsuccessful.
|
||||
Constant *
|
||||
llvm::ConstantFoldCall(Function *F, ArrayRef<Constant *> Operands) {
|
||||
llvm::ConstantFoldCall(Function *F, ArrayRef<Constant *> Operands,
|
||||
const TargetLibraryInfo *TLI) {
|
||||
if (!F->hasName()) return 0;
|
||||
StringRef Name = F->getName();
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -44,6 +44,7 @@
|
||||
#include "llvm/Analysis/ValueTracking.h"
|
||||
#include "llvm/Assembly/Writer.h"
|
||||
#include "llvm/Target/TargetData.h"
|
||||
#include "llvm/Target/TargetLibraryInfo.h"
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/PassManager.h"
|
||||
#include "llvm/IntrinsicInst.h"
|
||||
@ -103,6 +104,7 @@ namespace {
|
||||
AliasAnalysis *AA;
|
||||
DominatorTree *DT;
|
||||
TargetData *TD;
|
||||
TargetLibraryInfo *TLI;
|
||||
|
||||
std::string Messages;
|
||||
raw_string_ostream MessagesStr;
|
||||
@ -117,6 +119,7 @@ namespace {
|
||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.setPreservesAll();
|
||||
AU.addRequired<AliasAnalysis>();
|
||||
AU.addRequired<TargetLibraryInfo>();
|
||||
AU.addRequired<DominatorTree>();
|
||||
}
|
||||
virtual void print(raw_ostream &O, const Module *M) const {}
|
||||
@ -149,6 +152,7 @@ namespace {
|
||||
char Lint::ID = 0;
|
||||
INITIALIZE_PASS_BEGIN(Lint, "lint", "Statically lint-checks LLVM IR",
|
||||
false, true)
|
||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
||||
INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
|
||||
INITIALIZE_PASS_END(Lint, "lint", "Statically lint-checks LLVM IR",
|
||||
@ -174,6 +178,7 @@ bool Lint::runOnFunction(Function &F) {
|
||||
AA = &getAnalysis<AliasAnalysis>();
|
||||
DT = &getAnalysis<DominatorTree>();
|
||||
TD = getAnalysisIfAvailable<TargetData>();
|
||||
TLI = &getAnalysis<TargetLibraryInfo>();
|
||||
visit(F);
|
||||
dbgs() << MessagesStr.str();
|
||||
Messages.clear();
|
||||
@ -614,7 +619,7 @@ Value *Lint::findValueImpl(Value *V, bool OffsetOk,
|
||||
|
||||
// As a last resort, try SimplifyInstruction or constant folding.
|
||||
if (Instruction *Inst = dyn_cast<Instruction>(V)) {
|
||||
if (Value *W = SimplifyInstruction(Inst, TD, DT))
|
||||
if (Value *W = SimplifyInstruction(Inst, TD, TLI, DT))
|
||||
return findValueImpl(W, OffsetOk, Visited);
|
||||
} else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) {
|
||||
if (Value *W = ConstantFoldConstantExpression(CE, TD))
|
||||
|
@ -284,7 +284,7 @@ Value *PHITransAddr::PHITranslateSubExpr(Value *V, BasicBlock *CurBB,
|
||||
}
|
||||
|
||||
// See if the add simplifies away.
|
||||
if (Value *Res = SimplifyAddInst(LHS, RHS, isNSW, isNUW, TD, DT)) {
|
||||
if (Value *Res = SimplifyAddInst(LHS, RHS, isNSW, isNUW, TD, TLI, DT)) {
|
||||
// If we simplified the operands, the LHS is no longer an input, but Res
|
||||
// is.
|
||||
RemoveInstInputs(LHS, InstInputs);
|
||||
|
@ -74,6 +74,7 @@
|
||||
#include "llvm/Analysis/ValueTracking.h"
|
||||
#include "llvm/Assembly/Writer.h"
|
||||
#include "llvm/Target/TargetData.h"
|
||||
#include "llvm/Target/TargetLibraryInfo.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/ConstantRange.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
@ -108,6 +109,7 @@ INITIALIZE_PASS_BEGIN(ScalarEvolution, "scalar-evolution",
|
||||
"Scalar Evolution Analysis", false, true)
|
||||
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
||||
INITIALIZE_PASS_END(ScalarEvolution, "scalar-evolution",
|
||||
"Scalar Evolution Analysis", false, true)
|
||||
char ScalarEvolution::ID = 0;
|
||||
@ -3116,7 +3118,7 @@ const SCEV *ScalarEvolution::createNodeForPHI(PHINode *PN) {
|
||||
// PHI's incoming blocks are in a different loop, in which case doing so
|
||||
// risks breaking LCSSA form. Instcombine would normally zap these, but
|
||||
// it doesn't have DominatorTree information, so it may miss cases.
|
||||
if (Value *V = SimplifyInstruction(PN, TD, DT))
|
||||
if (Value *V = SimplifyInstruction(PN, TD, TLI, DT))
|
||||
if (LI->replacementPreservesLCSSAForm(PN, V))
|
||||
return getSCEV(V);
|
||||
|
||||
@ -6560,6 +6562,7 @@ bool ScalarEvolution::runOnFunction(Function &F) {
|
||||
this->F = &F;
|
||||
LI = &getAnalysis<LoopInfo>();
|
||||
TD = getAnalysisIfAvailable<TargetData>();
|
||||
TLI = &getAnalysis<TargetLibraryInfo>();
|
||||
DT = &getAnalysis<DominatorTree>();
|
||||
return false;
|
||||
}
|
||||
@ -6596,6 +6599,7 @@ void ScalarEvolution::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.setPreservesAll();
|
||||
AU.addRequiredTransitive<LoopInfo>();
|
||||
AU.addRequiredTransitive<DominatorTree>();
|
||||
AU.addRequired<TargetLibraryInfo>();
|
||||
}
|
||||
|
||||
bool ScalarEvolution::hasLoopInvariantBackedgeTakenCount(const Loop *L) {
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "llvm/Analysis/InstructionSimplify.h"
|
||||
#include "llvm/Analysis/ProfileInfo.h"
|
||||
#include "llvm/Target/TargetData.h"
|
||||
#include "llvm/Target/TargetLibraryInfo.h"
|
||||
#include "llvm/Target/TargetLowering.h"
|
||||
#include "llvm/Transforms/Utils/AddrModeMatcher.h"
|
||||
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
|
||||
@ -69,6 +70,7 @@ namespace {
|
||||
/// TLI - Keep a pointer of a TargetLowering to consult for determining
|
||||
/// transformation profitability.
|
||||
const TargetLowering *TLI;
|
||||
const TargetLibraryInfo *TLInfo;
|
||||
DominatorTree *DT;
|
||||
ProfileInfo *PFI;
|
||||
|
||||
@ -97,6 +99,7 @@ namespace {
|
||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.addPreserved<DominatorTree>();
|
||||
AU.addPreserved<ProfileInfo>();
|
||||
AU.addRequired<TargetLibraryInfo>();
|
||||
}
|
||||
|
||||
private:
|
||||
@ -116,7 +119,10 @@ namespace {
|
||||
}
|
||||
|
||||
char CodeGenPrepare::ID = 0;
|
||||
INITIALIZE_PASS(CodeGenPrepare, "codegenprepare",
|
||||
INITIALIZE_PASS_BEGIN(CodeGenPrepare, "codegenprepare",
|
||||
"Optimize for code generation", false, false)
|
||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
||||
INITIALIZE_PASS_END(CodeGenPrepare, "codegenprepare",
|
||||
"Optimize for code generation", false, false)
|
||||
|
||||
FunctionPass *llvm::createCodeGenPreparePass(const TargetLowering *TLI) {
|
||||
@ -127,6 +133,7 @@ bool CodeGenPrepare::runOnFunction(Function &F) {
|
||||
bool EverMadeChange = false;
|
||||
|
||||
ModifiedDT = false;
|
||||
TLInfo = &getAnalysis<TargetLibraryInfo>();
|
||||
DT = getAnalysisIfAvailable<DominatorTree>();
|
||||
PFI = getAnalysisIfAvailable<ProfileInfo>();
|
||||
|
||||
@ -542,7 +549,7 @@ bool CodeGenPrepare::OptimizeCallInst(CallInst *CI) {
|
||||
WeakVH IterHandle(CurInstIterator);
|
||||
|
||||
ReplaceAndSimplifyAllUses(CI, RetVal, TLI ? TLI->getTargetData() : 0,
|
||||
ModifiedDT ? 0 : DT);
|
||||
TLInfo, ModifiedDT ? 0 : DT);
|
||||
|
||||
// If the iterator instruction was recursively deleted, start over at the
|
||||
// start of the block.
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include "llvm/Analysis/Dominators.h"
|
||||
#include "llvm/Analysis/InstructionSimplify.h"
|
||||
#include "llvm/Target/TargetData.h"
|
||||
#include "llvm/Target/TargetLibraryInfo.h"
|
||||
#include "llvm/Transforms/Utils/Local.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/RecyclingAllocator.h"
|
||||
@ -215,6 +216,7 @@ namespace {
|
||||
class EarlyCSE : public FunctionPass {
|
||||
public:
|
||||
const TargetData *TD;
|
||||
const TargetLibraryInfo *TLI;
|
||||
DominatorTree *DT;
|
||||
typedef RecyclingAllocator<BumpPtrAllocator,
|
||||
ScopedHashTableVal<SimpleValue, Value*> > AllocatorTy;
|
||||
@ -263,6 +265,7 @@ private:
|
||||
// This transformation requires dominator postdominator info
|
||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.addRequired<DominatorTree>();
|
||||
AU.addRequired<TargetLibraryInfo>();
|
||||
AU.setPreservesCFG();
|
||||
}
|
||||
};
|
||||
@ -277,6 +280,7 @@ FunctionPass *llvm::createEarlyCSEPass() {
|
||||
|
||||
INITIALIZE_PASS_BEGIN(EarlyCSE, "early-cse", "Early CSE", false, false)
|
||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
||||
INITIALIZE_PASS_END(EarlyCSE, "early-cse", "Early CSE", false, false)
|
||||
|
||||
bool EarlyCSE::processNode(DomTreeNode *Node) {
|
||||
@ -328,7 +332,7 @@ bool EarlyCSE::processNode(DomTreeNode *Node) {
|
||||
|
||||
// If the instruction can be simplified (e.g. X+0 = X) then replace it with
|
||||
// its simpler value.
|
||||
if (Value *V = SimplifyInstruction(Inst, TD, DT)) {
|
||||
if (Value *V = SimplifyInstruction(Inst, TD, TLI, DT)) {
|
||||
DEBUG(dbgs() << "EarlyCSE Simplify: " << *Inst << " to: " << *V << '\n');
|
||||
Inst->replaceAllUsesWith(V);
|
||||
Inst->eraseFromParent();
|
||||
@ -455,6 +459,7 @@ bool EarlyCSE::processNode(DomTreeNode *Node) {
|
||||
|
||||
bool EarlyCSE::runOnFunction(Function &F) {
|
||||
TD = getAnalysisIfAvailable<TargetData>();
|
||||
TLI = &getAnalysis<TargetLibraryInfo>();
|
||||
DT = &getAnalysis<DominatorTree>();
|
||||
|
||||
// Tables that the pass uses when walking the domtree.
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include "llvm/Analysis/ValueTracking.h"
|
||||
#include "llvm/Assembly/Writer.h"
|
||||
#include "llvm/Target/TargetData.h"
|
||||
#include "llvm/Target/TargetLibraryInfo.h"
|
||||
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
|
||||
#include "llvm/Transforms/Utils/SSAUpdater.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
@ -446,7 +447,8 @@ namespace {
|
||||
MemoryDependenceAnalysis *MD;
|
||||
DominatorTree *DT;
|
||||
const TargetData *TD;
|
||||
|
||||
const TargetLibraryInfo *TLI;
|
||||
|
||||
ValueTable VN;
|
||||
|
||||
/// LeaderTable - A mapping from value numbers to lists of Value*'s that
|
||||
@ -530,6 +532,7 @@ namespace {
|
||||
// This transformation requires dominator postdominator info
|
||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.addRequired<DominatorTree>();
|
||||
AU.addRequired<TargetLibraryInfo>();
|
||||
if (!NoLoads)
|
||||
AU.addRequired<MemoryDependenceAnalysis>();
|
||||
AU.addRequired<AliasAnalysis>();
|
||||
@ -568,6 +571,7 @@ FunctionPass *llvm::createGVNPass(bool NoLoads) {
|
||||
INITIALIZE_PASS_BEGIN(GVN, "gvn", "Global Value Numbering", false, false)
|
||||
INITIALIZE_PASS_DEPENDENCY(MemoryDependenceAnalysis)
|
||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
||||
INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
|
||||
INITIALIZE_PASS_END(GVN, "gvn", "Global Value Numbering", false, false)
|
||||
|
||||
@ -2032,7 +2036,7 @@ bool GVN::processInstruction(Instruction *I) {
|
||||
// to value numbering it. Value numbering often exposes redundancies, for
|
||||
// example if it determines that %y is equal to %x then the instruction
|
||||
// "%z = and i32 %x, %y" becomes "%z = and i32 %x, %x" which we now simplify.
|
||||
if (Value *V = SimplifyInstruction(I, TD, DT)) {
|
||||
if (Value *V = SimplifyInstruction(I, TD, TLI, DT)) {
|
||||
I->replaceAllUsesWith(V);
|
||||
if (MD && V->getType()->isPointerTy())
|
||||
MD->invalidateCachedPointerInfo(V);
|
||||
@ -2134,6 +2138,7 @@ bool GVN::runOnFunction(Function& F) {
|
||||
MD = &getAnalysis<MemoryDependenceAnalysis>();
|
||||
DT = &getAnalysis<DominatorTree>();
|
||||
TD = getAnalysisIfAvailable<TargetData>();
|
||||
TLI = &getAnalysis<TargetLibraryInfo>();
|
||||
VN.setAliasAnalysis(&getAnalysis<AliasAnalysis>());
|
||||
VN.setMemDep(MD);
|
||||
VN.setDomTree(DT);
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include "llvm/Analysis/LoopPass.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Target/TargetData.h"
|
||||
#include "llvm/Target/TargetLibraryInfo.h"
|
||||
#include "llvm/Transforms/Scalar.h"
|
||||
#include "llvm/Transforms/Utils/Local.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
@ -43,6 +44,7 @@ namespace {
|
||||
AU.addPreservedID(LoopSimplifyID);
|
||||
AU.addPreservedID(LCSSAID);
|
||||
AU.addPreserved("scalar-evolution");
|
||||
AU.addRequired<TargetLibraryInfo>();
|
||||
}
|
||||
};
|
||||
}
|
||||
@ -50,6 +52,7 @@ namespace {
|
||||
char LoopInstSimplify::ID = 0;
|
||||
INITIALIZE_PASS_BEGIN(LoopInstSimplify, "loop-instsimplify",
|
||||
"Simplify instructions in loops", false, false)
|
||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
||||
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
||||
INITIALIZE_PASS_DEPENDENCY(LCSSA)
|
||||
@ -64,6 +67,7 @@ bool LoopInstSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
|
||||
DominatorTree *DT = getAnalysisIfAvailable<DominatorTree>();
|
||||
LoopInfo *LI = &getAnalysis<LoopInfo>();
|
||||
const TargetData *TD = getAnalysisIfAvailable<TargetData>();
|
||||
const TargetLibraryInfo *TLI = &getAnalysis<TargetLibraryInfo>();
|
||||
|
||||
SmallVector<BasicBlock*, 8> ExitBlocks;
|
||||
L->getUniqueExitBlocks(ExitBlocks);
|
||||
@ -104,7 +108,7 @@ bool LoopInstSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
|
||||
|
||||
// Don't bother simplifying unused instructions.
|
||||
if (!I->use_empty()) {
|
||||
Value *V = SimplifyInstruction(I, TD, DT);
|
||||
Value *V = SimplifyInstruction(I, TD, TLI, DT);
|
||||
if (V && LI->replacementPreservesLCSSAForm(I, V)) {
|
||||
// Mark all uses for resimplification next time round the loop.
|
||||
for (Value::use_iterator UI = I->use_begin(), UE = I->use_end();
|
||||
|
@ -1021,7 +1021,7 @@ void LoopUnswitch::SimplifyCode(std::vector<Instruction*> &Worklist, Loop *L) {
|
||||
// See if instruction simplification can hack this up. This is common for
|
||||
// things like "select false, X, Y" after unswitching made the condition be
|
||||
// 'false'.
|
||||
if (Value *V = SimplifyInstruction(I, 0, DT))
|
||||
if (Value *V = SimplifyInstruction(I, 0, 0, DT))
|
||||
if (LI->replacementPreservesLCSSAForm(I, V)) {
|
||||
ReplaceUsesOfWith(I, V, Worklist, L, LPM);
|
||||
continue;
|
||||
|
@ -265,7 +265,7 @@ ReprocessLoop:
|
||||
PHINode *PN;
|
||||
for (BasicBlock::iterator I = L->getHeader()->begin();
|
||||
(PN = dyn_cast<PHINode>(I++)); )
|
||||
if (Value *V = SimplifyInstruction(PN, 0, DT)) {
|
||||
if (Value *V = SimplifyInstruction(PN, 0, 0, DT)) {
|
||||
if (AA) AA->deleteValue(PN);
|
||||
if (SE) SE->forgetValue(PN);
|
||||
PN->replaceAllUsesWith(V);
|
||||
@ -456,7 +456,7 @@ static PHINode *FindPHIToPartitionLoops(Loop *L, DominatorTree *DT,
|
||||
for (BasicBlock::iterator I = L->getHeader()->begin(); isa<PHINode>(I); ) {
|
||||
PHINode *PN = cast<PHINode>(I);
|
||||
++I;
|
||||
if (Value *V = SimplifyInstruction(PN, 0, DT)) {
|
||||
if (Value *V = SimplifyInstruction(PN, 0, 0, DT)) {
|
||||
// This is a degenerate PHI already, don't modify it!
|
||||
PN->replaceAllUsesWith(V);
|
||||
if (AA) AA->deleteValue(PN);
|
||||
|
@ -590,7 +590,7 @@ void PromoteMem2Reg::run() {
|
||||
PHINode *PN = I->second;
|
||||
|
||||
// If this PHI node merges one value and/or undefs, get the value.
|
||||
if (Value *V = SimplifyInstruction(PN, 0, &DT)) {
|
||||
if (Value *V = SimplifyInstruction(PN, 0, 0, &DT)) {
|
||||
if (AST && PN->getType()->isPointerTy())
|
||||
AST->deleteValue(PN);
|
||||
PN->replaceAllUsesWith(V);
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "llvm/Analysis/Dominators.h"
|
||||
#include "llvm/Analysis/InstructionSimplify.h"
|
||||
#include "llvm/Target/TargetData.h"
|
||||
#include "llvm/Target/TargetLibraryInfo.h"
|
||||
#include "llvm/Transforms/Scalar.h"
|
||||
#include "llvm/Transforms/Utils/Local.h"
|
||||
using namespace llvm;
|
||||
@ -39,12 +40,14 @@ namespace {
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.setPreservesCFG();
|
||||
AU.addRequired<TargetLibraryInfo>();
|
||||
}
|
||||
|
||||
/// runOnFunction - Remove instructions that simplify.
|
||||
bool runOnFunction(Function &F) {
|
||||
const DominatorTree *DT = getAnalysisIfAvailable<DominatorTree>();
|
||||
const TargetData *TD = getAnalysisIfAvailable<TargetData>();
|
||||
const TargetLibraryInfo *TLI = &getAnalysis<TargetLibraryInfo>();
|
||||
SmallPtrSet<const Instruction*, 8> S1, S2, *ToSimplify = &S1, *Next = &S2;
|
||||
bool Changed = false;
|
||||
|
||||
@ -60,7 +63,7 @@ namespace {
|
||||
continue;
|
||||
// Don't waste time simplifying unused instructions.
|
||||
if (!I->use_empty())
|
||||
if (Value *V = SimplifyInstruction(I, TD, DT)) {
|
||||
if (Value *V = SimplifyInstruction(I, TD, TLI, DT)) {
|
||||
// Mark all uses for resimplification next time round the loop.
|
||||
for (Value::use_iterator UI = I->use_begin(), UE = I->use_end();
|
||||
UI != UE; ++UI)
|
||||
@ -84,8 +87,11 @@ namespace {
|
||||
}
|
||||
|
||||
char InstSimplifier::ID = 0;
|
||||
INITIALIZE_PASS(InstSimplifier, "instsimplify", "Remove redundant instructions",
|
||||
false, false)
|
||||
INITIALIZE_PASS_BEGIN(InstSimplifier, "instsimplify",
|
||||
"Remove redundant instructions", false, false)
|
||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
||||
INITIALIZE_PASS_END(InstSimplifier, "instsimplify",
|
||||
"Remove redundant instructions", false, false)
|
||||
char &llvm::InstructionSimplifierID = InstSimplifier::ID;
|
||||
|
||||
// Public interface to the simplify instructions pass.
|
||||
|
Loading…
x
Reference in New Issue
Block a user