If a target specified a stack pointer with setStackPointerRegisterToSaveRestore,
authorChris Lattner <sabre@nondot.org>
Fri, 13 Jan 2006 17:48:44 +0000 (17:48 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 13 Jan 2006 17:48:44 +0000 (17:48 +0000)
lower STACKSAVE/STACKRESTORE into a copy from/to that register.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25276 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

index 5ea8b3dd1e834721df68421a91bd60a3fda94605..af7fce423f367bc1eaaca894ddef142228605bd3 100644 (file)
@@ -1453,10 +1453,20 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
       AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1));
       return Result.getValue(Op.ResNo);
     case TargetLowering::Expand:
-      Tmp1 = DAG.getNode(ISD::UNDEF, Node->getValueType(0));
-      AddLegalizedOperand(SDOperand(Node, 0), Tmp1);
-      AddLegalizedOperand(SDOperand(Node, 1), Node->getOperand(0));
-      return Op.ResNo ? Node->getOperand(0) : Tmp1;
+      // Expand to CopyFromReg if the target set 
+      // StackPointerRegisterToSaveRestore.
+      if (unsigned SP = TLI.getStackPointerRegisterToSaveRestore()) {
+        Tmp1 = DAG.getCopyFromReg(Node->getOperand(0), SP, 
+                                  Node->getValueType(0));
+        AddLegalizedOperand(SDOperand(Node, 0), Tmp1);
+        AddLegalizedOperand(SDOperand(Node, 1), Tmp1.getValue(1));
+        return Tmp1.getValue(Op.ResNo);
+      } else {
+        Tmp1 = DAG.getNode(ISD::UNDEF, Node->getValueType(0));
+        AddLegalizedOperand(SDOperand(Node, 0), Tmp1);
+        AddLegalizedOperand(SDOperand(Node, 1), Node->getOperand(0));
+        return Op.ResNo ? Node->getOperand(0) : Tmp1;
+      }
     }
     
   case ISD::STACKRESTORE:
@@ -1478,7 +1488,13 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
     case TargetLowering::Legal:
       break;
     case TargetLowering::Expand:
-      Result = Tmp1;
+      // Expand to CopyToReg if the target set 
+      // StackPointerRegisterToSaveRestore.
+      if (unsigned SP = TLI.getStackPointerRegisterToSaveRestore()) {
+        Result = DAG.getCopyToReg(Tmp1, SP, Tmp2);
+      } else {
+        Result = Tmp1;
+      }
       break;
     }
     break;