Restore this patch now that the latent bug has been fixed
authorChris Lattner <sabre@nondot.org>
Fri, 2 Sep 2005 01:24:55 +0000 (01:24 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 2 Sep 2005 01:24:55 +0000 (01:24 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23209 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PowerPC/PPCISelLowering.cpp

index 5b77784819f0c1551cea8f64d028dbba1339a889..8490adb3c333a6568e2fd79716b637d882e23e04 100644 (file)
@@ -613,8 +613,12 @@ PPC32TargetLowering::LowerCallTo(SDOperand Chain,
   
   std::vector<MVT::ValueType> RetVals;
   MVT::ValueType RetTyVT = getValueType(RetTy);
+  MVT::ValueType ActualRetTyVT = RetTyVT;
+  if (RetTyVT >= MVT::i1 && RetTyVT <= MVT::i16)
+    ActualRetTyVT = MVT::i32;   // Promote result to i32.
+    
   if (RetTyVT != MVT::isVoid)
-    RetVals.push_back(RetTyVT);
+    RetVals.push_back(ActualRetTyVT);
   RetVals.push_back(MVT::Other);
   
   SDOperand TheCall = SDOperand(DAG.getCall(RetVals,
@@ -622,7 +626,17 @@ PPC32TargetLowering::LowerCallTo(SDOperand Chain,
   Chain = TheCall.getValue(RetTyVT != MVT::isVoid);
   Chain = DAG.getNode(ISD::CALLSEQ_END, MVT::Other, Chain,
                       DAG.getConstant(NumBytes, getPointerTy()));
-  return std::make_pair(TheCall, Chain);
+  SDOperand RetVal = TheCall;
+  
+  // If the result is a small value, add a note so that we keep track of the
+  // information about whether it is sign or zero extended.
+  if (RetTyVT != ActualRetTyVT) {
+    RetVal = DAG.getNode(RetTy->isSigned() ? ISD::AssertSext : ISD::AssertZext,
+                         MVT::i32, RetVal, DAG.getValueType(RetTyVT));
+    RetVal = DAG.getNode(ISD::TRUNCATE, RetTyVT, RetVal);
+  }
+  
+  return std::make_pair(RetVal, Chain);
 }
 
 SDOperand PPC32TargetLowering::LowerVAStart(SDOperand Chain, SDOperand VAListP,