Re-add ConstantFoldInstOperands form taking opcode and return type.
Summary: This form was replaced by a form taking an instruction instead of opcode and return type in r258391. After committing this change (and some depending, follow-up changes) it turned out in the review thread to be controversial. The discussion didn't come to a conclusion yet. I'm re-adding the old form to fix the API regression and to provide a better base for discussion, possibly on llvm-dev. A difference to the original function is that it can't be called with GEPs (similarly to how it was already the case for compares). In order to support opaque pointers in the future, folding GEPs needs to be passed the source element type, which is not possible with the current API. Reviewers: dberlin, reames Subscribers: dblaikie, eddyb Differential Revision: http://reviews.llvm.org/D17901 llvm-svn: 263501
This commit is contained in:
parent
f9709ee001
commit
6be355961e
|
@ -55,6 +55,19 @@ Constant *ConstantFoldInstOperands(Instruction *I, ArrayRef<Constant *> Ops,
|
|||
const DataLayout &DL,
|
||||
const TargetLibraryInfo *TLI = nullptr);
|
||||
|
||||
/// ConstantFoldInstOperands - Attempt to constant fold an instruction with the
|
||||
/// specified operands. If successful, the constant result is returned, if not,
|
||||
/// null is returned. Note that this function can fail when attempting to
|
||||
/// fold instructions like loads and stores, which have no constant expression
|
||||
/// form.
|
||||
///
|
||||
/// This function doesn't work for compares (use ConstantFoldCompareInstOperands
|
||||
/// for this) and GEPs.
|
||||
Constant *ConstantFoldInstOperands(unsigned Opcode, Type *DestTy,
|
||||
ArrayRef<Constant *> Ops,
|
||||
const DataLayout &DL,
|
||||
const TargetLibraryInfo *TLI = nullptr);
|
||||
|
||||
/// ConstantFoldCompareInstOperands - Attempt to constant fold a compare
|
||||
/// instruction (icmp/fcmp) with the specified operands. If it fails, it
|
||||
/// returns a constant expression of the specified operands.
|
||||
|
|
|
@ -902,12 +902,11 @@ static Constant *SymbolicallyEvaluateGEP(const GEPOperator *GEP,
|
|||
/// folding using this function strips this information.
|
||||
///
|
||||
static Constant *ConstantFoldInstOperandsImpl(const Value *InstOrCE,
|
||||
Type *DestTy,
|
||||
unsigned Opcode,
|
||||
ArrayRef<Constant *> Ops,
|
||||
const DataLayout &DL,
|
||||
const TargetLibraryInfo *TLI) {
|
||||
Type *DestTy = InstOrCE->getType();
|
||||
|
||||
// Handle easy binops first.
|
||||
if (Instruction::isBinaryOp(Opcode))
|
||||
return ConstantFoldBinaryOpOperands(Opcode, Ops[0], Ops[1], DL);
|
||||
|
@ -1040,7 +1039,8 @@ ConstantFoldConstantExpressionImpl(const ConstantExpr *CE, const DataLayout &DL,
|
|||
return ConstantFoldCompareInstOperands(CE->getPredicate(), Ops[0], Ops[1],
|
||||
DL, TLI);
|
||||
|
||||
return ConstantFoldInstOperandsImpl(CE, CE->getOpcode(), Ops, DL, TLI);
|
||||
return ConstantFoldInstOperandsImpl(CE, CE->getType(), CE->getOpcode(), Ops,
|
||||
DL, TLI);
|
||||
}
|
||||
|
||||
Constant *llvm::ConstantFoldConstantExpression(const ConstantExpr *CE,
|
||||
|
@ -1054,7 +1054,16 @@ Constant *llvm::ConstantFoldInstOperands(Instruction *I,
|
|||
ArrayRef<Constant *> Ops,
|
||||
const DataLayout &DL,
|
||||
const TargetLibraryInfo *TLI) {
|
||||
return ConstantFoldInstOperandsImpl(I, I->getOpcode(), Ops, DL, TLI);
|
||||
return ConstantFoldInstOperandsImpl(I, I->getType(), I->getOpcode(), Ops, DL,
|
||||
TLI);
|
||||
}
|
||||
|
||||
Constant *llvm::ConstantFoldInstOperands(unsigned Opcode, Type *DestTy,
|
||||
ArrayRef<Constant *> Ops,
|
||||
const DataLayout &DL,
|
||||
const TargetLibraryInfo *TLI) {
|
||||
assert(Opcode != Instruction::GetElementPtr && "Invalid for GEPs");
|
||||
return ConstantFoldInstOperandsImpl(nullptr, DestTy, Opcode, Ops, DL, TLI);
|
||||
}
|
||||
|
||||
Constant *llvm::ConstantFoldCompareInstOperands(unsigned Predicate,
|
||||
|
|
Loading…
Reference in New Issue