summaryrefslogtreecommitdiffstats
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
commitd265e88827238b00e4d759b12da8cbeac8f558cf (patch)
tree667f0186dd8a7804d2958e7f78d7f59c020af9f8
parent5fed3b95db1dcbbcdb7408e51b0fbd62af53c24e (diff)
downloadbcm5719-llvm-d265e88827238b00e4d759b12da8cbeac8f558cf.tar.gz
bcm5719-llvm-d265e88827238b00e4d759b12da8cbeac8f558cf.zip
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. llvm-svn: 188149
-rw-r--r--llvm/lib/Target/Mips/Mips16HardFloat.cpp14
-rw-r--r--llvm/test/CodeGen/Mips/f16abs.ll25
2 files changed, 38 insertions, 1 deletions
diff --git a/llvm/lib/Target/Mips/Mips16HardFloat.cpp b/llvm/lib/Target/Mips/Mips16HardFloat.cpp
index 7e456aa6d1e..7374636b833 100644
--- a/llvm/lib/Target/Mips/Mips16HardFloat.cpp
+++ b/llvm/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;
}
diff --git a/llvm/test/CodeGen/Mips/f16abs.ll b/llvm/test/CodeGen/Mips/f16abs.ll
new file mode 100644
index 00000000000..fe3795770b2
--- /dev/null
+++ b/llvm/test/CodeGen/Mips/f16abs.ll
@@ -0,0 +1,25 @@
+; RUN: llc -mtriple=mipsel-linux-gnu -march=mipsel -mcpu=mips16 -soft-float -mips16-hard-float -relocation-model=static < %s | FileCheck %s -check-prefix=static
+
+@y = global double -1.450000e+00, align 8
+@x = common global double 0.000000e+00, align 8
+
+; Function Attrs: nounwind optsize
+define i32 @main() #0 {
+entry:
+ %0 = load double* @y, align 8
+ %call = tail call double @fabs(double %0) #2
+ store double %call, double* @x, align 8
+; static-NOT: .ent __call_stub_fp_fabs
+; static-NOT: jal fabs
+ ret i32 0
+}
+
+; Function Attrs: nounwind optsize readnone
+declare double @fabs(double) #1
+
+attributes #0 = { nounwind optsize "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="true" }
+attributes #1 = { nounwind optsize readnone "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="true" }
+attributes #2 = { nounwind optsize readnone }
+
+
+
OpenPOWER on IntegriCloud