diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2023-12-17 20:41:09 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2023-12-17 20:41:09 +0000 |
| commit | 312c0ed19cc5276a17bacf2120097bec4515b0f1 (patch) | |
| tree | e6e4a4163840b73ba54bb0d3b70ee4899e4b7434 /llvm/lib/Transforms/InstCombine/InstructionCombining.cpp | |
| parent | b1c73532ee8997fe5dfbeb7d223027bdf99758a0 (diff) | |
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstructionCombining.cpp')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstructionCombining.cpp | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp index f072f5cec309..a7ddadc25de4 100644 --- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -610,7 +610,7 @@ static Value *getIdentityValue(Instruction::BinaryOps Opcode, Value *V) { /// allow more factorization opportunities. static Instruction::BinaryOps getBinOpsForFactorization(Instruction::BinaryOps TopOpcode, BinaryOperator *Op, - Value *&LHS, Value *&RHS) { + Value *&LHS, Value *&RHS, BinaryOperator *OtherOp) { assert(Op && "Expected a binary operator"); LHS = Op->getOperand(0); RHS = Op->getOperand(1); @@ -623,6 +623,13 @@ getBinOpsForFactorization(Instruction::BinaryOps TopOpcode, BinaryOperator *Op, } // TODO: We can add other conversions e.g. shr => div etc. } + if (Instruction::isBitwiseLogicOp(TopOpcode)) { + if (OtherOp && OtherOp->getOpcode() == Instruction::AShr && + match(Op, m_LShr(m_NonNegative(), m_Value()))) { + // lshr nneg C, X --> ashr nneg C, X + return Instruction::AShr; + } + } return Op->getOpcode(); } @@ -963,9 +970,9 @@ Value *InstCombinerImpl::tryFactorizationFolds(BinaryOperator &I) { Instruction::BinaryOps LHSOpcode, RHSOpcode; if (Op0) - LHSOpcode = getBinOpsForFactorization(TopLevelOpcode, Op0, A, B); + LHSOpcode = getBinOpsForFactorization(TopLevelOpcode, Op0, A, B, Op1); if (Op1) - RHSOpcode = getBinOpsForFactorization(TopLevelOpcode, Op1, C, D); + RHSOpcode = getBinOpsForFactorization(TopLevelOpcode, Op1, C, D, Op0); // The instruction has the form "(A op' B) op (C op' D)". Try to factorize // a common term. @@ -1132,6 +1139,14 @@ Value *InstCombinerImpl::SimplifySelectsFeedingBinaryOp(BinaryOperator &I, }; if (LHSIsSelect && RHSIsSelect && A == D) { + // op(select(%v, %x, %y), select(%v, %y, %x)) --> op(%x, %y) + if (I.isCommutative() && B == F && C == E) { + Value *BI = Builder.CreateBinOp(I.getOpcode(), B, E); + if (auto *BO = dyn_cast<BinaryOperator>(BI)) + BO->copyIRFlags(&I); + return BI; + } + // (A ? B : C) op (A ? E : F) -> A ? (B op E) : (C op F) Cond = A; True = simplifyBinOp(Opcode, B, E, FMF, Q); @@ -2182,16 +2197,6 @@ Value *InstCombiner::getFreelyInvertedImpl(Value *V, bool WillInvertAllUses, return nullptr; } - // Treat lshr with non-negative operand as ashr. - if (match(V, m_LShr(m_Value(A), m_Value(B))) && - isKnownNonNegative(A, SQ.getWithInstruction(cast<Instruction>(V)), - Depth)) { - if (auto *AV = getFreelyInvertedImpl(A, A->hasOneUse(), Builder, - DoesConsume, Depth)) - return Builder ? Builder->CreateAShr(AV, B) : NonNull; - return nullptr; - } - Value *Cond; // LogicOps are special in that we canonicalize them at the cost of an // instruction. |
