diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2022-07-14 18:50:02 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2022-07-14 18:50:02 +0000 |
| commit | 1f917f69ff07f09b6dbb670971f57f8efe718b84 (patch) | |
| tree | 99293cbc1411737cd995dac10a99b2c40ef0944c /llvm/lib/Transforms/InstCombine/InstructionCombining.cpp | |
| parent | 145449b1e420787bb99721a429341fa6be3adfb6 (diff) | |
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstructionCombining.cpp')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstructionCombining.cpp | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp index 0816a4a575d9..75520a0c8d5f 100644 --- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -523,11 +523,12 @@ bool InstCombinerImpl::SimplifyAssociativeOrCommutative(BinaryOperator &I) { // Transform: "(A op C1) op (B op C2)" ==> "(A op B) op (C1 op C2)" // if C1 and C2 are constants. Value *A, *B; - Constant *C1, *C2; + Constant *C1, *C2, *CRes; if (Op0 && Op1 && Op0->getOpcode() == Opcode && Op1->getOpcode() == Opcode && match(Op0, m_OneUse(m_BinOp(m_Value(A), m_Constant(C1)))) && - match(Op1, m_OneUse(m_BinOp(m_Value(B), m_Constant(C2))))) { + match(Op1, m_OneUse(m_BinOp(m_Value(B), m_Constant(C2)))) && + (CRes = ConstantFoldBinaryOpOperands(Opcode, C1, C2, DL))) { bool IsNUW = hasNoUnsignedWrap(I) && hasNoUnsignedWrap(*Op0) && hasNoUnsignedWrap(*Op1); @@ -544,7 +545,7 @@ bool InstCombinerImpl::SimplifyAssociativeOrCommutative(BinaryOperator &I) { InsertNewInstWith(NewBO, I); NewBO->takeName(Op1); replaceOperand(I, 0, NewBO); - replaceOperand(I, 1, ConstantExpr::get(Opcode, C1, C2)); + replaceOperand(I, 1, CRes); // Conservatively clear the optional flags, since they may not be // preserved by the reassociation. ClearSubclassDataAfterReassociation(I); @@ -1324,6 +1325,11 @@ Instruction *InstCombinerImpl::foldBinopWithPhiOperands(BinaryOperator &BO) { if (!isGuaranteedToTransferExecutionToSuccessor(&*BBIter)) return nullptr; + // Fold constants for the predecessor block with constant incoming values. + Constant *NewC = ConstantFoldBinaryOpOperands(BO.getOpcode(), C0, C1, DL); + if (!NewC) + return nullptr; + // Make a new binop in the predecessor block with the non-constant incoming // values. Builder.SetInsertPoint(PredBlockBranch); @@ -1333,9 +1339,6 @@ Instruction *InstCombinerImpl::foldBinopWithPhiOperands(BinaryOperator &BO) { if (auto *NotFoldedNewBO = dyn_cast<BinaryOperator>(NewBO)) NotFoldedNewBO->copyIRFlags(&BO); - // Fold constants for the predecessor block with constant incoming values. - Constant *NewC = ConstantExpr::get(BO.getOpcode(), C0, C1); - // Replace the binop with a phi of the new values. The old phis are dead. PHINode *NewPhi = PHINode::Create(BO.getType(), 2); NewPhi->addIncoming(NewBO, OtherBB); @@ -1774,9 +1777,10 @@ Instruction *InstCombinerImpl::foldVectorBinop(BinaryOperator &Inst) { // for target-independent shuffle creation. if (I >= SrcVecNumElts || ShMask[I] < 0) { Constant *MaybeUndef = - ConstOp1 ? ConstantExpr::get(Opcode, UndefScalar, CElt) - : ConstantExpr::get(Opcode, CElt, UndefScalar); - if (!match(MaybeUndef, m_Undef())) { + ConstOp1 + ? ConstantFoldBinaryOpOperands(Opcode, UndefScalar, CElt, DL) + : ConstantFoldBinaryOpOperands(Opcode, CElt, UndefScalar, DL); + if (!MaybeUndef || !match(MaybeUndef, m_Undef())) { MayChange = false; break; } |
