summaryrefslogtreecommitdiff
path: root/lib/Target/Mips/Mips16HardFloat.cpp
diff options
context:
space:
mode:
authorReed Kotler <rkotler@mips.com>2013-08-11 21:30:27 +0000
committerReed Kotler <rkotler@mips.com>2013-08-11 21:30:27 +0000
commit5e4b95b3fe908f89aa512b6e9921fe49aadd759b (patch)
treed9a4d8b26b8fb0c9a87aa4dda22d1f53a39da815 /lib/Target/Mips/Mips16HardFloat.cpp
parent55db69c97e936abf8290a4dc639239f92ab34fcb (diff)
downloadllvm-5e4b95b3fe908f89aa512b6e9921fe49aadd759b.tar.gz
llvm-5e4b95b3fe908f89aa512b6e9921fe49aadd759b.tar.bz2
llvm-5e4b95b3fe908f89aa512b6e9921fe49aadd759b.tar.xz
Don't generate floating point stubs for mips16 code if the function
is actually an instrinsic that will not occur in libc. This list here is not exhaustive but fixes the one places in test-suite where this occurs. I have filed a bug against myself to research the full list and add them to the array of such cases. In the future, actual stub generation will occur in a later phase and we won't need this code because we will know at that time during the compilation that in fact no helper function was even needed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188149 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/Mips/Mips16HardFloat.cpp')
-rw-r--r--lib/Target/Mips/Mips16HardFloat.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/lib/Target/Mips/Mips16HardFloat.cpp b/lib/Target/Mips/Mips16HardFloat.cpp
index 7e456aa6d1..7374636b83 100644
--- a/lib/Target/Mips/Mips16HardFloat.cpp
+++ b/lib/Target/Mips/Mips16HardFloat.cpp
@@ -16,6 +16,7 @@
#include "llvm/IR/Module.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
+#include <algorithm>
#include <string>
static void inlineAsmOut
@@ -321,6 +322,17 @@ static void assureFPCallStub(Function &F, Module *M,
}
//
+// Functions that are inline intrinsics don't need helpers.
+//
+std::string IntrinsicInline[] =
+ {"fabs"};
+
+bool isIntrinsicInline(Function *F) {
+ return std::binary_search(
+ IntrinsicInline, array_endof(IntrinsicInline),
+ F->getName());
+}
+//
// Returns of float, double and complex need to be handled with a helper
// function.
//
@@ -372,7 +384,7 @@ static bool fixupFPReturnAndCall
// helper functions
if (Subtarget.getRelocationModel() != Reloc::PIC_ ) {
Function *F_ = CI->getCalledFunction();
- if (F_ && needsFPHelperFromSig(*F_)) {
+ if (F_ && !isIntrinsicInline(F_) && needsFPHelperFromSig(*F_)) {
assureFPCallStub(*F_, M, Subtarget);
Modified=true;
}