[llvm-commits] CVS: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp

Evan Cheng evan.cheng at apple.com
Wed Jan 11 14:15:31 PST 2006



Changes in directory llvm/lib/Target/X86:

X86ISelDAGToDAG.cpp updated: 1.29 -> 1.30
---
Log message:

Select DYNAMIC_STACKALLOC


---
Diffs of the changes:  (+44 -1)

 X86ISelDAGToDAG.cpp |   45 ++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 44 insertions(+), 1 deletion(-)


Index: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
diff -u llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.29 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.30
--- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.29	Wed Jan 11 00:09:51 2006
+++ llvm/lib/Target/X86/X86ISelDAGToDAG.cpp	Wed Jan 11 16:15:18 2006
@@ -458,6 +458,9 @@
 
   if (Opcode >= ISD::BUILTIN_OP_END && Opcode < X86ISD::FIRST_NUMBER)
     return N;   // Already selected.
+
+  std::map<SDOperand, SDOperand>::iterator CGMI = CodeGenMap.find(N);
+  if (CGMI != CodeGenMap.end()) return CGMI->second;
   
   switch (Opcode) {
     default: break;
@@ -621,7 +624,7 @@
       SDOperand Tmp1 = CurDAG->getTargetNode(Opc, VT, Tmp0);
       SDOperand InFlag = SDOperand(0,0);
       SDOperand Result = CurDAG->getCopyToReg(CurDAG->getEntryNode(),
-                                              Reg, Tmp1, InFlag).getValue(1);
+                                              Reg, Tmp1, InFlag);
       SDOperand Chain = Result.getValue(0);
       InFlag = Result.getValue(1);
 
@@ -696,6 +699,46 @@
                                       Base, Scale, Index, Disp, Chain);
       return Chain;
     }
+
+    case ISD::DYNAMIC_STACKALLOC: {
+      SDOperand Chain = N.getOperand(0);
+      SDOperand Size  = N.getOperand(1);
+      SDOperand Align = N.getOperand(2);
+
+      // FIXME: We are currently ignoring the requested alignment for handling
+      // greater than the stack alignment.  This will need to be revisited at
+      // some point.
+      if (!isa<ConstantSDNode>(Align) ||
+          cast<ConstantSDNode>(Align)->getValue() != 0) {
+        std::cerr << "Cannot allocate stack object with greater alignment than"
+                  << " the stack alignment yet!";
+        abort();
+      }
+
+      // FIXME: This produces crappy code. Lots of unnecessary MOV32rr to and
+      // from ESP.
+      SDOperand InFlag;
+      SDOperand SPVal = CurDAG->getCopyFromReg(Chain, X86::ESP, MVT::i32, InFlag);
+      Chain  = SPVal.getValue(1);
+      InFlag = SPVal.getValue(2);
+
+      SDOperand Result = Select(CurDAG->getNode(X86ISD::SUB_FLAG, MVT::i32,
+                                                SPVal, Size, InFlag));
+      InFlag = Result.getValue(1);
+
+      // Force the result back into ESP.
+      Chain  = CurDAG->getCopyToReg(Chain,
+                                    CurDAG->getRegister(X86::ESP, MVT::i32),
+                                    Result, InFlag);
+      InFlag = Chain.getValue(1);
+
+      // Copy the result back from ESP.
+      Result = CurDAG->getCopyFromReg(Chain, X86::ESP, MVT::i32, InFlag);
+
+      CodeGenMap[N.getValue(0)] = Result;
+      CodeGenMap[N.getValue(1)] = Result.getValue(1);
+      return Result.getValue(N.ResNo);
+    }
   }
 
   return SelectCode(N);






More information about the llvm-commits mailing list