Move more logic into getTypeForExtArgOrReturn.
authorCameron Zwarich <zwarich@apple.com>
Thu, 17 Mar 2011 14:53:37 +0000 (14:53 +0000)
committerCameron Zwarich <zwarich@apple.com>
Thu, 17 Mar 2011 14:53:37 +0000 (14:53 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127809 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/TargetLowering.h
lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
lib/Target/X86/X86ISelLowering.cpp
lib/Target/X86/X86ISelLowering.h

index bf1188ffdf5a618a1b1f4589b4de146de67b9ea9..5b3f2b35bf8d3bcd4c6dd948a4f7541daced4f3d 100644 (file)
@@ -1293,9 +1293,10 @@ public:
   /// but this is not true all the time, e.g. i1 on x86-64. It is also not
   /// necessary for non-C calling conventions. The frontend should handle this
   /// and include all of the necessary information.
-  virtual MVT
-  getTypeForExtArgOrReturn(EVT VT, ISD::NodeType ExtendKind) const {
-    return MVT::i32;
+  virtual EVT getTypeForExtArgOrReturn(LLVMContext &Context, EVT VT,
+                                       ISD::NodeType ExtendKind) const {
+    EVT MinVT = getRegisterType(Context, MVT::i32);
+    return VT.bitsLT(MinVT) ? MinVT : VT;
   }
 
   /// LowerOperationWrapper - This callback is invoked by the type legalizer
index 9671a45062f37f3712f1ec74eea3079a2b41482d..16a6107fe24c8f74739021eed34ae6b7aa50edd5 100644 (file)
@@ -1128,12 +1128,8 @@ void SelectionDAGBuilder::visitRet(const ReturnInst &I) {
         else if (F->paramHasAttr(0, Attribute::ZExt))
           ExtendKind = ISD::ZERO_EXTEND;
 
-        if (ExtendKind != ISD::ANY_EXTEND && VT.isInteger()) {
-          MVT ReturnMVT = TLI.getTypeForExtArgOrReturn(VT, ExtendKind);
-          EVT MinVT = TLI.getRegisterType(*DAG.getContext(), ReturnMVT);
-          if (VT.bitsLT(MinVT))
-            VT = MinVT;
-        }
+        if (ExtendKind != ISD::ANY_EXTEND && VT.isInteger())
+          VT = TLI.getTypeForExtArgOrReturn(*DAG.getContext(), VT, ExtendKind);
 
         unsigned NumParts = TLI.getNumRegisters(*DAG.getContext(), VT);
         EVT PartVT = TLI.getRegisterType(*DAG.getContext(), VT);
index dfb7b87d4ea0168e2e2418d408ea737cc733bf73..a4d01a10a72188a0ad00e06b4d308bda3710f597 100644 (file)
@@ -1448,13 +1448,18 @@ bool X86TargetLowering::isUsedByReturnOnly(SDNode *N) const {
   return HasRet;
 }
 
-MVT
-X86TargetLowering::getTypeForExtArgOrReturn(EVT VT,
+EVT
+X86TargetLowering::getTypeForExtArgOrReturn(LLVMContext &Context, EVT VT,
                                             ISD::NodeType ExtendKind) const {
+  MVT ReturnMVT;
   // TODO: Is this also valid on 32-bit?
   if (Subtarget->is64Bit() && VT == MVT::i1 && ExtendKind == ISD::ZERO_EXTEND)
-    return MVT::i8;
-  return MVT::i32;
+    ReturnMVT = MVT::i8;
+  else
+    ReturnMVT = MVT::i32;
+
+  EVT MinVT = getRegisterType(Context, ReturnMVT);
+  return VT.bitsLT(MinVT) ? MinVT : VT;
 }
 
 /// LowerCallResult - Lower the result values of a call into the
index bd9247b0a65b74f25a15808027e57f9195d7d682..7c1b13a1ad533812e4839d2f9ef12f9433dce124 100644 (file)
@@ -843,8 +843,9 @@ namespace llvm {
 
     virtual bool isUsedByReturnOnly(SDNode *N) const;
 
-    virtual MVT
-    getTypeForExtArgOrReturn(EVT VT, ISD::NodeType ExtendKind) const;
+    virtual EVT
+    getTypeForExtArgOrReturn(LLVMContext &Context, EVT VT,
+                             ISD::NodeType ExtendKind) const;
 
     virtual bool
       CanLowerReturn(CallingConv::ID CallConv, bool isVarArg,