diff options
author | Cameron McInally <cameron.mcinally@nyu.edu> | 2019-06-11 15:45:41 +0000 |
---|---|---|
committer | Cameron McInally <cameron.mcinally@nyu.edu> | 2019-06-11 15:45:41 +0000 |
commit | 796de11331e69f0ff241fe45a4bb51720518102f (patch) | |
tree | 0f90e8c66d772e6f02803b17da10c347b6f8781c /llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp | |
parent | 9d51fa5508cec8bbacbb61aeefe7899ac622983e (diff) | |
download | bcm5719-llvm-796de11331e69f0ff241fe45a4bb51720518102f.tar.gz bcm5719-llvm-796de11331e69f0ff241fe45a4bb51720518102f.zip |
[InstCombine] Update fptrunc (fneg x)) -> (fneg (fptrunc x) for unary FNeg
Differential Revision: https://reviews.llvm.org/D62629
llvm-svn: 363080
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp index 36be8bdf6f3..2c9ba203fbf 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp @@ -1615,12 +1615,20 @@ Instruction *InstCombiner::visitFPTrunc(FPTruncInst &FPT) { return CastInst::CreateFPCast(ExactResult, Ty); } } + } - // (fptrunc (fneg x)) -> (fneg (fptrunc x)) - Value *X; - if (match(OpI, m_FNeg(m_Value(X)))) { + // (fptrunc (fneg x)) -> (fneg (fptrunc x)) + Value *X; + Instruction *Op = dyn_cast<Instruction>(FPT.getOperand(0)); + if (Op && Op->hasOneUse()) { + if (match(Op, m_FNeg(m_Value(X)))) { Value *InnerTrunc = Builder.CreateFPTrunc(X, Ty); - return BinaryOperator::CreateFNegFMF(InnerTrunc, OpI); + + // FIXME: Once we're sure that unary FNeg optimizations are on par with + // binary FNeg, this should always return a unary operator. + if (isa<BinaryOperator>(Op)) + return BinaryOperator::CreateFNegFMF(InnerTrunc, Op); + return UnaryOperator::CreateFNegFMF(InnerTrunc, Op); } } |