From 29c6bf45c37a3a0c2b37a6034ee4685bfa741b82 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 8 Jul 2022 17:11:08 +0200 Subject: [PATCH] [InstCombine] Avoid ConstantExpr::get() call Avoid calling ConstantExpr::get() for associative/commutative binops, call ConstantFoldBinaryOpOperands() instead. We only want to perform the reassociation of the constants actually fold. --- llvm/lib/Transforms/InstCombine/InstructionCombining.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp index 0335815..6c27296 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); -- 2.7.4