[llvm] r182343 - Add some additional functions to the list of helper functions for

Reed Kotler rkotler at mips.com
Mon May 20 17:50:30 PDT 2013


Author: rkotler
Date: Mon May 20 19:50:30 2013
New Revision: 182343

URL: http://llvm.org/viewvc/llvm-project?rev=182343&view=rev
Log:
Add some additional functions to the list of helper functions for
pic calls. These need to be there so we don't try and use helper
functions when we call those.

As part of this, make sure that we properly exclude helper functions in pic
mode when indirect calls are involved.


Added:
    llvm/trunk/test/CodeGen/Mips/hfptrcall.ll
Modified:
    llvm/trunk/lib/Target/Mips/Mips16ISelLowering.cpp

Modified: llvm/trunk/lib/Target/Mips/Mips16ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/Mips16ISelLowering.cpp?rev=182343&r1=182342&r2=182343&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/Mips16ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/Mips/Mips16ISelLowering.cpp Mon May 20 19:50:30 2013
@@ -46,9 +46,13 @@ Mips16TargetLowering::Mips16TargetLoweri
   // Set up the register classes
   addRegisterClass(MVT::i32, &Mips::CPU16RegsRegClass);
 
-  if (Subtarget->inMips16HardFloat())
+  if (Subtarget->inMips16HardFloat()) {
     setMips16HardFloatLibCalls();
-
+    NoHelperNeeded.insert("__mips16_ret_sf");
+    NoHelperNeeded.insert("__mips16_ret_df");
+    NoHelperNeeded.insert("__mips16_ret_sc");
+    NoHelperNeeded.insert("__mips16_ret_dc");
+  }
   setOperationAction(ISD::ATOMIC_FENCE,       MVT::Other, Expand);
   setOperationAction(ISD::ATOMIC_CMP_SWAP,    MVT::i32,   Expand);
   setOperationAction(ISD::ATOMIC_SWAP,        MVT::i32,   Expand);
@@ -383,6 +387,13 @@ getOpndList(SmallVectorImpl<SDValue> &Op
         LookupHelper = false;
       }
     }
+    else if (GlobalAddressSDNode *G = 
+             dyn_cast<GlobalAddressSDNode>(CLI.Callee)) {
+      if (NoHelperNeeded.find(G->getGlobal()->getName().data()) != 
+                              NoHelperNeeded.end()) {
+        LookupHelper = false;
+      }
+    }
     if (LookupHelper) Mips16HelperFunction =
       getMips16HelperFunction(CLI.RetTy, CLI.Args, NeedMips16Helper);
 

Added: llvm/trunk/test/CodeGen/Mips/hfptrcall.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Mips/hfptrcall.ll?rev=182343&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/Mips/hfptrcall.ll (added)
+++ llvm/trunk/test/CodeGen/Mips/hfptrcall.ll Mon May 20 19:50:30 2013
@@ -0,0 +1,67 @@
+; RUN: llc -mtriple=mipsel-linux-gnu -march=mipsel -mcpu=mips16 -soft-float -mips16-hard-float -relocation-model=pic < %s | FileCheck %s -check-prefix=picel
+
+ at ptrsv = global float ()* @sv, align 4
+ at ptrdv = global double ()* @dv, align 4
+ at ptrscv = global { float, float } ()* @scv, align 4
+ at ptrdcv = global { double, double } ()* @dcv, align 4
+ at x = common global float 0.000000e+00, align 4
+ at .str = private unnamed_addr constant [4 x i8] c"%f\0A\00", align 1
+ at xd = common global double 0.000000e+00, align 8
+ at xy = common global { float, float } zeroinitializer, align 4
+ at .str1 = private unnamed_addr constant [10 x i8] c"%f + %fi\0A\00", align 1
+ at xyd = common global { double, double } zeroinitializer, align 8
+
+; Function Attrs: nounwind
+define float @sv() #0 {
+entry:
+  ret float 1.000000e+01
+}
+; picel: 	.ent	sv
+; picel: 	lw	${{[0-9]+}}, %call16(__mips16_ret_sf)(${{[0-9]+}})
+; picel:	.end	sv
+
+; Function Attrs: nounwind
+define double @dv() #0 {
+entry:
+  ret double 1.500000e+01
+}
+
+; picel: 	.ent	dv
+; picel: 	lw	${{[0-9]+}}, %call16(__mips16_ret_df)(${{[0-9]+}})
+; picel:	.end	dv
+
+; Function Attrs: nounwind
+define { float, float } @scv() #0 {
+entry:
+  %retval = alloca { float, float }, align 4
+  %real = getelementptr inbounds { float, float }* %retval, i32 0, i32 0
+  %imag = getelementptr inbounds { float, float }* %retval, i32 0, i32 1
+  store float 5.000000e+00, float* %real
+  store float 9.900000e+01, float* %imag
+  %0 = load { float, float }* %retval
+  ret { float, float } %0
+}
+
+; picel: 	.ent	scv
+; picel: 	lw	${{[0-9]+}}, %call16(__mips16_ret_sc)(${{[0-9]+}})
+; picel:	.end	scv
+
+; Function Attrs: nounwind
+define { double, double } @dcv() #0 {
+entry:
+  %retval = alloca { double, double }, align 8
+  %real = getelementptr inbounds { double, double }* %retval, i32 0, i32 0
+  %imag = getelementptr inbounds { double, double }* %retval, i32 0, i32 1
+  store double 0x416BC8B0A0000000, double* %real
+  store double 0x41CDCCB763800000, double* %imag
+  %0 = load { double, double }* %retval
+  ret { double, double } %0
+}
+
+; picel: 	.ent	dcv
+; picel: 	lw	${{[0-9]+}}, %call16(__mips16_ret_dc)(${{[0-9]+}})
+; picel:	.end	dcv
+
+
+attributes #0 = { nounwind "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" "unsafe-fp-math"="false" "use-soft-float"="true" }
+





More information about the llvm-commits mailing list