diff options
| -rw-r--r-- | llvm/lib/Analysis/InstructionSimplify.cpp | 8 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll | 8 |
2 files changed, 10 insertions, 6 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index 22ced5a8665..13805437b54 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -4359,6 +4359,14 @@ static Value *SimplifyFAddInst(Value *Op0, Value *Op1, FastMathFlags FMF, match(Op1, m_FSub(m_AnyZeroFP(), m_Specific(Op0))))) return ConstantFP::getNullValue(Op0->getType()); + // (X - Y) + Y --> X + // Y + (X - Y) --> X + Value *X; + if (FMF.noSignedZeros() && FMF.allowReassoc() && + (match(Op0, m_FSub(m_Value(X), m_Specific(Op1))) || + match(Op1, m_FSub(m_Value(X), m_Specific(Op0))))) + return X; + return nullptr; } diff --git a/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll b/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll index 9c139d38621..305e508480f 100644 --- a/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll +++ b/llvm/test/Transforms/InstSimplify/floating-point-arithmetic.ll @@ -849,9 +849,7 @@ define float @fadd_fsub_common_op_wrong_commute_commute(float %x, float %y) { define <2 x float> @fsub_fadd_common_op_vec(<2 x float> %x, <2 x float> %y) { ; CHECK-LABEL: @fsub_fadd_common_op_vec( -; CHECK-NEXT: [[S:%.*]] = fsub <2 x float> [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[R:%.*]] = fadd reassoc nsz <2 x float> [[Y]], [[S]] -; CHECK-NEXT: ret <2 x float> [[R]] +; CHECK-NEXT: ret <2 x float> [[X:%.*]] ; %s = fsub <2 x float> %x, %y %r = fadd reassoc nsz <2 x float> %y, %s @@ -862,9 +860,7 @@ define <2 x float> @fsub_fadd_common_op_vec(<2 x float> %x, <2 x float> %y) { define float @fsub_fadd_common_op_commute(float %x, float %y) { ; CHECK-LABEL: @fsub_fadd_common_op_commute( -; CHECK-NEXT: [[S:%.*]] = fsub float [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[R:%.*]] = fadd reassoc nsz float [[S]], [[Y]] -; CHECK-NEXT: ret float [[R]] +; CHECK-NEXT: ret float [[X:%.*]] ; %s = fsub float %x, %y %r = fadd reassoc nsz float %s, %y |

