mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
InstCombine: Use the new SimplifyQuery versions of Simplify*. Use AssumptionCache, DominatorTree, TargetLibraryInfo everywhere.
llvm-svn: 301464
This commit is contained in:
parent
95701f5ce4
commit
1979d95e05
@ -1037,7 +1037,7 @@ Instruction *InstCombiner::visitAdd(BinaryOperator &I) {
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
if (Value *V = SimplifyAddInst(LHS, RHS, I.hasNoSignedWrap(),
|
||||
I.hasNoUnsignedWrap(), DL, &TLI, &DT, &AC))
|
||||
I.hasNoUnsignedWrap(), SQ))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
// (A*B)+(A*C) -> A*(B+C) etc
|
||||
@ -1358,8 +1358,7 @@ Instruction *InstCombiner::visitFAdd(BinaryOperator &I) {
|
||||
if (Value *V = SimplifyVectorOp(I))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
if (Value *V =
|
||||
SimplifyFAddInst(LHS, RHS, I.getFastMathFlags(), DL, &TLI, &DT, &AC))
|
||||
if (Value *V = SimplifyFAddInst(LHS, RHS, I.getFastMathFlags(), SQ))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
if (isa<Constant>(RHS))
|
||||
@ -1550,7 +1549,7 @@ Instruction *InstCombiner::visitSub(BinaryOperator &I) {
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
if (Value *V = SimplifySubInst(Op0, Op1, I.hasNoSignedWrap(),
|
||||
I.hasNoUnsignedWrap(), DL, &TLI, &DT, &AC))
|
||||
I.hasNoUnsignedWrap(), SQ))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
// (A*B)-(A*C) -> A*(B-C) etc
|
||||
@ -1756,8 +1755,7 @@ Instruction *InstCombiner::visitFSub(BinaryOperator &I) {
|
||||
if (Value *V = SimplifyVectorOp(I))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
if (Value *V =
|
||||
SimplifyFSubInst(Op0, Op1, I.getFastMathFlags(), DL, &TLI, &DT, &AC))
|
||||
if (Value *V = SimplifyFSubInst(Op0, Op1, I.getFastMathFlags(), SQ))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
// fsub nsz 0, X ==> fsub nsz -0.0, X
|
||||
|
@ -1254,7 +1254,7 @@ Instruction *InstCombiner::visitAnd(BinaryOperator &I) {
|
||||
if (Value *V = SimplifyVectorOp(I))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
if (Value *V = SimplifyAndInst(Op0, Op1, DL, &TLI, &DT, &AC))
|
||||
if (Value *V = SimplifyAndInst(Op0, Op1, SQ))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
// See if we can simplify any instructions used by the instruction whose sole
|
||||
@ -2039,7 +2039,7 @@ Instruction *InstCombiner::visitOr(BinaryOperator &I) {
|
||||
if (Value *V = SimplifyVectorOp(I))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
if (Value *V = SimplifyOrInst(Op0, Op1, DL, &TLI, &DT, &AC))
|
||||
if (Value *V = SimplifyOrInst(Op0, Op1, SQ))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
// See if we can simplify any instructions used by the instruction whose sole
|
||||
@ -2415,7 +2415,7 @@ Instruction *InstCombiner::visitXor(BinaryOperator &I) {
|
||||
if (Value *V = SimplifyVectorOp(I))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
if (Value *V = SimplifyXorInst(Op0, Op1, DL, &TLI, &DT, &AC))
|
||||
if (Value *V = SimplifyXorInst(Op0, Op1, SQ))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
if (Instruction *NewXor = foldXorToXor(I))
|
||||
|
@ -1818,8 +1818,8 @@ Instruction *InstCombiner::visitVACopyInst(VACopyInst &I) {
|
||||
/// lifting.
|
||||
Instruction *InstCombiner::visitCallInst(CallInst &CI) {
|
||||
auto Args = CI.arg_operands();
|
||||
if (Value *V = SimplifyCall(CI.getCalledValue(), Args.begin(), Args.end(), DL,
|
||||
&TLI, &DT, &AC))
|
||||
if (Value *V =
|
||||
SimplifyCall(CI.getCalledValue(), Args.begin(), Args.end(), SQ))
|
||||
return replaceInstUsesWith(CI, V);
|
||||
|
||||
if (isFreeCall(&CI, &TLI))
|
||||
|
@ -4269,8 +4269,8 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
|
||||
Changed = true;
|
||||
}
|
||||
|
||||
if (Value *V =
|
||||
SimplifyICmpInst(I.getPredicate(), Op0, Op1, DL, &TLI, &DT, &AC, &I))
|
||||
if (Value *V = SimplifyICmpInst(I.getPredicate(), Op0, Op1,
|
||||
SQ.getWithInstruction(&I)))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
// comparing -val or val with non-zero is the same as just comparing val
|
||||
@ -4778,8 +4778,9 @@ Instruction *InstCombiner::visitFCmpInst(FCmpInst &I) {
|
||||
|
||||
Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
|
||||
|
||||
if (Value *V = SimplifyFCmpInst(I.getPredicate(), Op0, Op1,
|
||||
I.getFastMathFlags(), DL, &TLI, &DT, &AC, &I))
|
||||
if (Value *V =
|
||||
SimplifyFCmpInst(I.getPredicate(), Op0, Op1, I.getFastMathFlags(),
|
||||
SQ.getWithInstruction(&I)))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
// Simplify 'fcmp pred X, X'
|
||||
|
@ -17,9 +17,11 @@
|
||||
|
||||
#include "llvm/Analysis/AliasAnalysis.h"
|
||||
#include "llvm/Analysis/AssumptionCache.h"
|
||||
#include "llvm/Analysis/InstructionSimplify.h"
|
||||
#include "llvm/Analysis/LoopInfo.h"
|
||||
#include "llvm/Analysis/TargetFolder.h"
|
||||
#include "llvm/Analysis/ValueTracking.h"
|
||||
#include "llvm/IR/DIBuilder.h"
|
||||
#include "llvm/IR/Dominators.h"
|
||||
#include "llvm/IR/IRBuilder.h"
|
||||
#include "llvm/IR/InstVisitor.h"
|
||||
@ -27,10 +29,9 @@
|
||||
#include "llvm/IR/Operator.h"
|
||||
#include "llvm/IR/PatternMatch.h"
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/Support/Dwarf.h"
|
||||
#include "llvm/Transforms/InstCombine/InstCombineWorklist.h"
|
||||
#include "llvm/Transforms/Utils/Local.h"
|
||||
#include "llvm/Support/Dwarf.h"
|
||||
#include "llvm/IR/DIBuilder.h"
|
||||
|
||||
#define DEBUG_TYPE "instcombine"
|
||||
|
||||
@ -193,7 +194,7 @@ private:
|
||||
TargetLibraryInfo &TLI;
|
||||
DominatorTree &DT;
|
||||
const DataLayout &DL;
|
||||
|
||||
const SimplifyQuery SQ;
|
||||
// Optional analyses. When non-null, these can both be used to do better
|
||||
// combining and will be updated to reflect any changes.
|
||||
LoopInfo *LI;
|
||||
@ -203,11 +204,11 @@ private:
|
||||
public:
|
||||
InstCombiner(InstCombineWorklist &Worklist, BuilderTy *Builder,
|
||||
bool MinimizeSize, bool ExpensiveCombines, AliasAnalysis *AA,
|
||||
AssumptionCache &AC, TargetLibraryInfo &TLI,
|
||||
DominatorTree &DT, const DataLayout &DL, LoopInfo *LI)
|
||||
AssumptionCache &AC, TargetLibraryInfo &TLI, DominatorTree &DT,
|
||||
const DataLayout &DL, LoopInfo *LI)
|
||||
: Worklist(Worklist), Builder(Builder), MinimizeSize(MinimizeSize),
|
||||
ExpensiveCombines(ExpensiveCombines), AA(AA), AC(AC), TLI(TLI), DT(DT),
|
||||
DL(DL), LI(LI), MadeIRChange(false) {}
|
||||
DL(DL), SQ(DL, &TLI, &DT, &AC), LI(LI), MadeIRChange(false) {}
|
||||
|
||||
/// \brief Run the combiner over the entire worklist until it is empty.
|
||||
///
|
||||
@ -533,6 +534,12 @@ private:
|
||||
/// value, or null if it didn't simplify.
|
||||
Value *SimplifyUsingDistributiveLaws(BinaryOperator &I);
|
||||
|
||||
/// This tries to simplify binary operations by factorizing out common terms
|
||||
/// (e. g. "(A*B)+(A*C)" -> "A*(B+C)").
|
||||
Value *tryFactorization(InstCombiner::BuilderTy *, BinaryOperator &,
|
||||
Instruction::BinaryOps, Value *, Value *, Value *,
|
||||
Value *);
|
||||
|
||||
/// \brief Attempts to replace V with a simpler value based on the demanded
|
||||
/// bits.
|
||||
Value *SimplifyDemandedUseBits(Value *V, APInt DemandedMask, KnownBits &Known,
|
||||
|
@ -179,7 +179,7 @@ Instruction *InstCombiner::visitMul(BinaryOperator &I) {
|
||||
if (Value *V = SimplifyVectorOp(I))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
if (Value *V = SimplifyMulInst(Op0, Op1, DL, &TLI, &DT, &AC))
|
||||
if (Value *V = SimplifyMulInst(Op0, Op1, SQ))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
if (Value *V = SimplifyUsingDistributiveLaws(I))
|
||||
@ -606,8 +606,7 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) {
|
||||
if (isa<Constant>(Op0))
|
||||
std::swap(Op0, Op1);
|
||||
|
||||
if (Value *V =
|
||||
SimplifyFMulInst(Op0, Op1, I.getFastMathFlags(), DL, &TLI, &DT, &AC))
|
||||
if (Value *V = SimplifyFMulInst(Op0, Op1, I.getFastMathFlags(), SQ))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
bool AllowReassociate = I.hasUnsafeAlgebra();
|
||||
@ -1111,7 +1110,7 @@ Instruction *InstCombiner::visitUDiv(BinaryOperator &I) {
|
||||
if (Value *V = SimplifyVectorOp(I))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
if (Value *V = SimplifyUDivInst(Op0, Op1, DL, &TLI, &DT, &AC))
|
||||
if (Value *V = SimplifyUDivInst(Op0, Op1, SQ))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
// Handle the integer div common cases
|
||||
@ -1184,7 +1183,7 @@ Instruction *InstCombiner::visitSDiv(BinaryOperator &I) {
|
||||
if (Value *V = SimplifyVectorOp(I))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
if (Value *V = SimplifySDivInst(Op0, Op1, DL, &TLI, &DT, &AC))
|
||||
if (Value *V = SimplifySDivInst(Op0, Op1, SQ))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
// Handle the integer div common cases
|
||||
@ -1296,8 +1295,7 @@ Instruction *InstCombiner::visitFDiv(BinaryOperator &I) {
|
||||
if (Value *V = SimplifyVectorOp(I))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
if (Value *V = SimplifyFDivInst(Op0, Op1, I.getFastMathFlags(),
|
||||
DL, &TLI, &DT, &AC))
|
||||
if (Value *V = SimplifyFDivInst(Op0, Op1, I.getFastMathFlags(), SQ))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
if (isa<Constant>(Op0))
|
||||
@ -1481,7 +1479,7 @@ Instruction *InstCombiner::visitURem(BinaryOperator &I) {
|
||||
if (Value *V = SimplifyVectorOp(I))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
if (Value *V = SimplifyURemInst(Op0, Op1, DL, &TLI, &DT, &AC))
|
||||
if (Value *V = SimplifyURemInst(Op0, Op1, SQ))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
if (Instruction *common = commonIRemTransforms(I))
|
||||
@ -1524,7 +1522,7 @@ Instruction *InstCombiner::visitSRem(BinaryOperator &I) {
|
||||
if (Value *V = SimplifyVectorOp(I))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
if (Value *V = SimplifySRemInst(Op0, Op1, DL, &TLI, &DT, &AC))
|
||||
if (Value *V = SimplifySRemInst(Op0, Op1, SQ))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
// Handle the integer rem common cases
|
||||
@ -1597,8 +1595,7 @@ Instruction *InstCombiner::visitFRem(BinaryOperator &I) {
|
||||
if (Value *V = SimplifyVectorOp(I))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
if (Value *V = SimplifyFRemInst(Op0, Op1, I.getFastMathFlags(),
|
||||
DL, &TLI, &DT, &AC))
|
||||
if (Value *V = SimplifyFRemInst(Op0, Op1, I.getFastMathFlags(), SQ))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
// Handle cases involving: rem X, (select Cond, Y, Z)
|
||||
|
@ -880,7 +880,7 @@ Instruction *InstCombiner::SliceUpIllegalIntegerPHI(PHINode &FirstPhi) {
|
||||
// PHINode simplification
|
||||
//
|
||||
Instruction *InstCombiner::visitPHINode(PHINode &PN) {
|
||||
if (Value *V = SimplifyInstruction(&PN, DL, &TLI, &DT, &AC))
|
||||
if (Value *V = SimplifyInstruction(&PN, SQ))
|
||||
return replaceInstUsesWith(PN, V);
|
||||
|
||||
if (Instruction *Result = FoldPHIArgZextsIntoPHI(PN))
|
||||
|
@ -1121,8 +1121,7 @@ Instruction *InstCombiner::visitSelectInst(SelectInst &SI) {
|
||||
Value *FalseVal = SI.getFalseValue();
|
||||
Type *SelType = SI.getType();
|
||||
|
||||
if (Value *V =
|
||||
SimplifySelectInst(CondVal, TrueVal, FalseVal, DL, &TLI, &DT, &AC))
|
||||
if (Value *V = SimplifySelectInst(CondVal, TrueVal, FalseVal, SQ))
|
||||
return replaceInstUsesWith(SI, V);
|
||||
|
||||
if (Instruction *I = canonicalizeSelectToShuffle(SI))
|
||||
|
@ -520,7 +520,7 @@ Instruction *InstCombiner::visitShl(BinaryOperator &I) {
|
||||
|
||||
Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
|
||||
if (Value *V = SimplifyShlInst(Op0, Op1, I.hasNoSignedWrap(),
|
||||
I.hasNoUnsignedWrap(), DL, &TLI, &DT, &AC))
|
||||
I.hasNoUnsignedWrap(), SQ))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
if (Instruction *V = commonShiftTransforms(I))
|
||||
@ -618,7 +618,7 @@ Instruction *InstCombiner::visitLShr(BinaryOperator &I) {
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
|
||||
if (Value *V = SimplifyLShrInst(Op0, Op1, I.isExact(), DL, &TLI, &DT, &AC))
|
||||
if (Value *V = SimplifyLShrInst(Op0, Op1, I.isExact(), SQ))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
if (Instruction *R = commonShiftTransforms(I))
|
||||
@ -702,7 +702,7 @@ Instruction *InstCombiner::visitAShr(BinaryOperator &I) {
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
|
||||
if (Value *V = SimplifyAShrInst(Op0, Op1, I.isExact(), DL, &TLI, &DT, &AC))
|
||||
if (Value *V = SimplifyAShrInst(Op0, Op1, I.isExact(), SQ))
|
||||
return replaceInstUsesWith(I, V);
|
||||
|
||||
if (Instruction *R = commonShiftTransforms(I))
|
||||
|
@ -144,8 +144,8 @@ Instruction *InstCombiner::scalarizePHI(ExtractElementInst &EI, PHINode *PN) {
|
||||
}
|
||||
|
||||
Instruction *InstCombiner::visitExtractElementInst(ExtractElementInst &EI) {
|
||||
if (Value *V = SimplifyExtractElementInst(
|
||||
EI.getVectorOperand(), EI.getIndexOperand(), DL, &TLI, &DT, &AC))
|
||||
if (Value *V = SimplifyExtractElementInst(EI.getVectorOperand(),
|
||||
EI.getIndexOperand(), SQ))
|
||||
return replaceInstUsesWith(EI, V);
|
||||
|
||||
// If vector val is constant with all elements the same, replace EI with
|
||||
@ -1140,8 +1140,8 @@ Instruction *InstCombiner::visitShuffleVectorInst(ShuffleVectorInst &SVI) {
|
||||
SmallVector<int, 16> Mask = SVI.getShuffleMask();
|
||||
Type *Int32Ty = Type::getInt32Ty(SVI.getContext());
|
||||
|
||||
if (auto *V = SimplifyShuffleVectorInst(LHS, RHS, SVI.getMask(),
|
||||
SVI.getType(), DL, &TLI, &DT, &AC))
|
||||
if (auto *V =
|
||||
SimplifyShuffleVectorInst(LHS, RHS, SVI.getMask(), SVI.getType(), SQ))
|
||||
return replaceInstUsesWith(SVI, V);
|
||||
|
||||
bool MadeChange = false;
|
||||
|
@ -256,7 +256,7 @@ bool InstCombiner::SimplifyAssociativeOrCommutative(BinaryOperator &I) {
|
||||
Value *C = I.getOperand(1);
|
||||
|
||||
// Does "B op C" simplify?
|
||||
if (Value *V = SimplifyBinOp(Opcode, B, C, DL)) {
|
||||
if (Value *V = SimplifyBinOp(Opcode, B, C, SQ)) {
|
||||
// It simplifies to V. Form "A op V".
|
||||
I.setOperand(0, A);
|
||||
I.setOperand(1, V);
|
||||
@ -285,7 +285,7 @@ bool InstCombiner::SimplifyAssociativeOrCommutative(BinaryOperator &I) {
|
||||
Value *C = Op1->getOperand(1);
|
||||
|
||||
// Does "A op B" simplify?
|
||||
if (Value *V = SimplifyBinOp(Opcode, A, B, DL)) {
|
||||
if (Value *V = SimplifyBinOp(Opcode, A, B, SQ)) {
|
||||
// It simplifies to V. Form "V op C".
|
||||
I.setOperand(0, V);
|
||||
I.setOperand(1, C);
|
||||
@ -313,7 +313,7 @@ bool InstCombiner::SimplifyAssociativeOrCommutative(BinaryOperator &I) {
|
||||
Value *C = I.getOperand(1);
|
||||
|
||||
// Does "C op A" simplify?
|
||||
if (Value *V = SimplifyBinOp(Opcode, C, A, DL)) {
|
||||
if (Value *V = SimplifyBinOp(Opcode, C, A, SQ)) {
|
||||
// It simplifies to V. Form "V op B".
|
||||
I.setOperand(0, V);
|
||||
I.setOperand(1, B);
|
||||
@ -333,7 +333,7 @@ bool InstCombiner::SimplifyAssociativeOrCommutative(BinaryOperator &I) {
|
||||
Value *C = Op1->getOperand(1);
|
||||
|
||||
// Does "C op A" simplify?
|
||||
if (Value *V = SimplifyBinOp(Opcode, C, A, DL)) {
|
||||
if (Value *V = SimplifyBinOp(Opcode, C, A, SQ)) {
|
||||
// It simplifies to V. Form "B op V".
|
||||
I.setOperand(0, B);
|
||||
I.setOperand(1, V);
|
||||
@ -498,10 +498,10 @@ getBinOpsForFactorization(Instruction::BinaryOps TopLevelOpcode,
|
||||
|
||||
/// This tries to simplify binary operations by factorizing out common terms
|
||||
/// (e. g. "(A*B)+(A*C)" -> "A*(B+C)").
|
||||
static Value *tryFactorization(InstCombiner::BuilderTy *Builder,
|
||||
const DataLayout &DL, BinaryOperator &I,
|
||||
Instruction::BinaryOps InnerOpcode, Value *A,
|
||||
Value *B, Value *C, Value *D) {
|
||||
Value *InstCombiner::tryFactorization(InstCombiner::BuilderTy *Builder,
|
||||
BinaryOperator &I,
|
||||
Instruction::BinaryOps InnerOpcode,
|
||||
Value *A, Value *B, Value *C, Value *D) {
|
||||
assert(A && B && C && D && "All values must be provided");
|
||||
|
||||
Value *V = nullptr;
|
||||
@ -521,7 +521,7 @@ static Value *tryFactorization(InstCombiner::BuilderTy *Builder,
|
||||
std::swap(C, D);
|
||||
// Consider forming "A op' (B op D)".
|
||||
// If "B op D" simplifies then it can be formed with no cost.
|
||||
V = SimplifyBinOp(TopLevelOpcode, B, D, DL);
|
||||
V = SimplifyBinOp(TopLevelOpcode, B, D, SQ);
|
||||
// If "B op D" doesn't simplify then only go on if both of the existing
|
||||
// operations "A op' B" and "C op' D" will be zapped as no longer used.
|
||||
if (!V && LHS->hasOneUse() && RHS->hasOneUse())
|
||||
@ -540,7 +540,7 @@ static Value *tryFactorization(InstCombiner::BuilderTy *Builder,
|
||||
std::swap(C, D);
|
||||
// Consider forming "(A op C) op' B".
|
||||
// If "A op C" simplifies then it can be formed with no cost.
|
||||
V = SimplifyBinOp(TopLevelOpcode, A, C, DL);
|
||||
V = SimplifyBinOp(TopLevelOpcode, A, C, SQ);
|
||||
|
||||
// If "A op C" doesn't simplify then only go on if both of the existing
|
||||
// operations "A op' B" and "C op' D" will be zapped as no longer used.
|
||||
@ -610,23 +610,23 @@ Value *InstCombiner::SimplifyUsingDistributiveLaws(BinaryOperator &I) {
|
||||
// The instruction has the form "(A op' B) op (C op' D)". Try to factorize
|
||||
// a common term.
|
||||
if (Op0 && Op1 && LHSOpcode == RHSOpcode)
|
||||
if (Value *V = tryFactorization(Builder, DL, I, LHSOpcode, A, B, C, D))
|
||||
if (Value *V = tryFactorization(Builder, I, LHSOpcode, A, B, C, D))
|
||||
return V;
|
||||
|
||||
// The instruction has the form "(A op' B) op (C)". Try to factorize common
|
||||
// term.
|
||||
if (Op0)
|
||||
if (Value *Ident = getIdentityValue(LHSOpcode, RHS))
|
||||
if (Value *V = tryFactorization(Builder, DL, I, LHSOpcode, A, B, RHS,
|
||||
Ident))
|
||||
if (Value *V =
|
||||
tryFactorization(Builder, I, LHSOpcode, A, B, RHS, Ident))
|
||||
return V;
|
||||
|
||||
// The instruction has the form "(B) op (C op' D)". Try to factorize common
|
||||
// term.
|
||||
if (Op1)
|
||||
if (Value *Ident = getIdentityValue(RHSOpcode, LHS))
|
||||
if (Value *V = tryFactorization(Builder, DL, I, RHSOpcode, LHS, Ident,
|
||||
C, D))
|
||||
if (Value *V =
|
||||
tryFactorization(Builder, I, RHSOpcode, LHS, Ident, C, D))
|
||||
return V;
|
||||
}
|
||||
|
||||
@ -638,8 +638,8 @@ Value *InstCombiner::SimplifyUsingDistributiveLaws(BinaryOperator &I) {
|
||||
Instruction::BinaryOps InnerOpcode = Op0->getOpcode(); // op'
|
||||
|
||||
// Do "A op C" and "B op C" both simplify?
|
||||
if (Value *L = SimplifyBinOp(TopLevelOpcode, A, C, DL))
|
||||
if (Value *R = SimplifyBinOp(TopLevelOpcode, B, C, DL)) {
|
||||
if (Value *L = SimplifyBinOp(TopLevelOpcode, A, C, SQ))
|
||||
if (Value *R = SimplifyBinOp(TopLevelOpcode, B, C, SQ)) {
|
||||
// They do! Return "L op' R".
|
||||
++NumExpand;
|
||||
C = Builder->CreateBinOp(InnerOpcode, L, R);
|
||||
@ -655,8 +655,8 @@ Value *InstCombiner::SimplifyUsingDistributiveLaws(BinaryOperator &I) {
|
||||
Instruction::BinaryOps InnerOpcode = Op1->getOpcode(); // op'
|
||||
|
||||
// Do "A op B" and "A op C" both simplify?
|
||||
if (Value *L = SimplifyBinOp(TopLevelOpcode, A, B, DL))
|
||||
if (Value *R = SimplifyBinOp(TopLevelOpcode, A, C, DL)) {
|
||||
if (Value *L = SimplifyBinOp(TopLevelOpcode, A, B, SQ))
|
||||
if (Value *R = SimplifyBinOp(TopLevelOpcode, A, C, SQ)) {
|
||||
// They do! Return "L op' R".
|
||||
++NumExpand;
|
||||
A = Builder->CreateBinOp(InnerOpcode, L, R);
|
||||
@ -672,14 +672,14 @@ Value *InstCombiner::SimplifyUsingDistributiveLaws(BinaryOperator &I) {
|
||||
if (SI0->getCondition() == SI1->getCondition()) {
|
||||
Value *SI = nullptr;
|
||||
if (Value *V = SimplifyBinOp(TopLevelOpcode, SI0->getFalseValue(),
|
||||
SI1->getFalseValue(), DL, &TLI, &DT, &AC))
|
||||
SI1->getFalseValue(), SQ))
|
||||
SI = Builder->CreateSelect(SI0->getCondition(),
|
||||
Builder->CreateBinOp(TopLevelOpcode,
|
||||
SI0->getTrueValue(),
|
||||
SI1->getTrueValue()),
|
||||
V);
|
||||
if (Value *V = SimplifyBinOp(TopLevelOpcode, SI0->getTrueValue(),
|
||||
SI1->getTrueValue(), DL, &TLI, &DT, &AC))
|
||||
SI1->getTrueValue(), SQ))
|
||||
SI = Builder->CreateSelect(
|
||||
SI0->getCondition(), V,
|
||||
Builder->CreateBinOp(TopLevelOpcode, SI0->getFalseValue(),
|
||||
@ -1399,8 +1399,7 @@ Value *InstCombiner::SimplifyVectorOp(BinaryOperator &Inst) {
|
||||
Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
|
||||
SmallVector<Value*, 8> Ops(GEP.op_begin(), GEP.op_end());
|
||||
|
||||
if (Value *V =
|
||||
SimplifyGEPInst(GEP.getSourceElementType(), Ops, DL, &TLI, &DT, &AC))
|
||||
if (Value *V = SimplifyGEPInst(GEP.getSourceElementType(), Ops, SQ))
|
||||
return replaceInstUsesWith(GEP, V);
|
||||
|
||||
Value *PtrOp = GEP.getOperand(0);
|
||||
@ -1589,7 +1588,7 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
|
||||
if (SO1->getType() != GO1->getType())
|
||||
return nullptr;
|
||||
|
||||
Value* Sum = SimplifyAddInst(GO1, SO1, false, false, DL, &TLI, &DT, &AC);
|
||||
Value *Sum = SimplifyAddInst(GO1, SO1, false, false, SQ);
|
||||
// Only do the combine when we are sure the cost after the
|
||||
// merge is never more than that before the merge.
|
||||
if (Sum == nullptr)
|
||||
@ -2304,8 +2303,7 @@ Instruction *InstCombiner::visitExtractValueInst(ExtractValueInst &EV) {
|
||||
if (!EV.hasIndices())
|
||||
return replaceInstUsesWith(EV, Agg);
|
||||
|
||||
if (Value *V =
|
||||
SimplifyExtractValueInst(Agg, EV.getIndices(), DL, &TLI, &DT, &AC))
|
||||
if (Value *V = SimplifyExtractValueInst(Agg, EV.getIndices(), SQ))
|
||||
return replaceInstUsesWith(EV, V);
|
||||
|
||||
if (InsertValueInst *IV = dyn_cast<InsertValueInst>(Agg)) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user