Skip to content

Commit

Permalink
[InstSimplify] reduce code duplication for fmul folds; NFC
Browse files Browse the repository at this point in the history
The constant is already commuted for an fmul opcode,
but this code can be called more directly for fma,
so we have to swap for that caller. There are tests
in InstSimplify and InstCombine to verify that this
works as expected.
  • Loading branch information
rotateright committed Oct 3, 2022
1 parent 4987ae8 commit 7b7940f
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 13 deletions.
16 changes: 6 additions & 10 deletions llvm/lib/Analysis/InstructionSimplify.cpp
Expand Up @@ -5325,22 +5325,18 @@ static Value *simplifyFMAFMul(Value *Op0, Value *Op1, FastMathFlags FMF,
if (!isDefaultFPEnvironment(ExBehavior, Rounding))
return nullptr;

// fmul X, 1.0 ==> X
// Canonicalize constant as operand 1.
if (match(Op0, m_ImmConstant()))
std::swap(Op0, Op1);

// X * 1.0 --> X
if (match(Op1, m_FPOne()))
return Op0;

// fmul 1.0, X ==> X
if (match(Op0, m_FPOne()))
return Op1;

// fmul nnan nsz X, 0 ==> 0
// X * 0.0 --> 0.0 (with nnan and nsz)
if (FMF.noNaNs() && FMF.noSignedZeros() && match(Op1, m_AnyZeroFP()))
return ConstantFP::getNullValue(Op0->getType());

// fmul nnan nsz 0, X ==> 0
if (FMF.noNaNs() && FMF.noSignedZeros() && match(Op0, m_AnyZeroFP()))
return ConstantFP::getNullValue(Op1->getType());

// sqrt(X) * sqrt(X) --> X, if we can:
// 1. Remove the intermediate rounding (reassociate).
// 2. Ignore non-zero negative numbers because sqrt would produce NAN.
Expand Down
Expand Up @@ -161,9 +161,9 @@ define <2 x float> @fadd_x_n0_vec_undef_elt(<2 x float> %a) {
ret <2 x float> %ret
}

; fmul X, 1.0 ==> X
define double @fmul_X_1(double %a) {
; CHECK-LABEL: @fmul_X_1(
; fmul 1.0, X ==> X
define double @fmul_1_X(double %a) {
; CHECK-LABEL: @fmul_1_X(
; CHECK-NEXT: ret double [[A:%.*]]
;
%b = fmul double 1.0, %a
Expand Down

0 comments on commit 7b7940f

Please sign in to comment.