diff options
author | David Majnemer <david.majnemer@gmail.com> | 2016-04-14 07:13:24 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2016-04-14 07:13:24 +0000 |
commit | 0f26b0aeb4a91418d4c273bb25ab22f3b416a960 (patch) | |
tree | f4a1cfadf86bfb6a4a6aa20c9df02cea75ebfbef /llvm/lib/Analysis/CostModel.cpp | |
parent | d871531687b062862234a3346b50f1824e27ed3b (diff) | |
download | bcm5719-llvm-0f26b0aeb4a91418d4c273bb25ab22f3b416a960.tar.gz bcm5719-llvm-0f26b0aeb4a91418d4c273bb25ab22f3b416a960.zip |
[CodeGen] Teach LLVM how to lower @llvm.{min,max}num to {MIN,MAX}NAN
The behavior of {MIN,MAX}NAN differs from that of {MIN,MAX}NUM when only
one of the inputs is NaN: -NUM will return the non-NaN argument while
-NAN would return NaN.
It is desirable to lower to @llvm.{min,max}num to -NAN if they don't
have a native instruction for -NUM. Notably, ARMv7 NEON's vmin has the
-NAN semantics.
N.B. Of course, it is only safe to do this if the intrinsic call is
marked nnan.
llvm-svn: 266279
Diffstat (limited to 'llvm/lib/Analysis/CostModel.cpp')
-rw-r--r-- | llvm/lib/Analysis/CostModel.cpp | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/CostModel.cpp b/llvm/lib/Analysis/CostModel.cpp index 0383cbfbbe4..36a1db664e1 100644 --- a/llvm/lib/Analysis/CostModel.cpp +++ b/llvm/lib/Analysis/CostModel.cpp @@ -504,8 +504,12 @@ unsigned CostModelAnalysis::getInstructionCost(const Instruction *I) const { for (unsigned J = 0, JE = II->getNumArgOperands(); J != JE; ++J) Args.push_back(II->getArgOperand(J)); + FastMathFlags FMF; + if (auto *FPMO = dyn_cast<FPMathOperator>(II)) + FMF = FPMO->getFastMathFlags(); + return TTI->getIntrinsicInstrCost(II->getIntrinsicID(), II->getType(), - Args); + Args, FMF); } return -1; default: |