diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2016-01-30 05:02:00 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2016-01-30 05:02:00 +0000 |
commit | 56c079f3934e8a76f3a60065d17e3a5dfdd39325 (patch) | |
tree | c10aba26e9fd3a52740becf25d76f1d96accde8c /llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp | |
parent | ed0f1138857e8c90b18206686828453a56c3a76e (diff) | |
download | llvm-56c079f3934e8a76f3a60065d17e3a5dfdd39325.zip llvm-56c079f3934e8a76f3a60065d17e3a5dfdd39325.tar.gz llvm-56c079f3934e8a76f3a60065d17e3a5dfdd39325.tar.bz2 |
InstCombine: fabs(x) * fabs(x) -> x * x
llvm-svn: 259295
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp index 160792b..161d3eb 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp @@ -612,12 +612,23 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) { } } - // sqrt(X) * sqrt(X) -> X - if (AllowReassociate && (Op0 == Op1)) - if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(Op0)) - if (II->getIntrinsicID() == Intrinsic::sqrt) + if (Op0 == Op1) { + if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(Op0)) { + // sqrt(X) * sqrt(X) -> X + if (AllowReassociate && II->getIntrinsicID() == Intrinsic::sqrt) return ReplaceInstUsesWith(I, II->getOperand(0)); + // fabs(X) * fabs(X) -> X * X + if (II->getIntrinsicID() == Intrinsic::fabs) { + Instruction *FMulVal = BinaryOperator::CreateFMul(II->getOperand(0), + II->getOperand(0), + I.getName()); + FMulVal->copyFastMathFlags(&I); + return FMulVal; + } + } + } + // Under unsafe algebra do: // X * log2(0.5*Y) = X*log2(Y) - X if (AllowReassociate) { |