diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp index 03358150d733ec..6c2729613f6a19 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);