Implement dynamic allocas
authorAnton Korobeynikov <asl@math.spbu.ru>
Thu, 16 Jul 2009 14:08:15 +0000 (14:08 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Thu, 16 Jul 2009 14:08:15 +0000 (14:08 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75985 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/SystemZ/SystemZISelLowering.cpp
lib/Target/SystemZ/SystemZRegisterInfo.cpp
test/CodeGen/SystemZ/09-DynamicAlloca.ll [new file with mode: 0644]

index e50dc4f7856294628d384eceeb0ae4588aad8452..c1004e12c8efaaae95213d387dcfe1c3d721d77e 100644 (file)
@@ -68,6 +68,7 @@ SystemZTargetLowering::SystemZTargetLowering(SystemZTargetMachine &tm) :
   setOperationAction(ISD::BR_CC,            MVT::i64, Custom);
   setOperationAction(ISD::GlobalAddress,    MVT::i64, Custom);
   setOperationAction(ISD::JumpTable,        MVT::i64, Custom);
+  setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i64, Expand);
 
   // FIXME: Can we lower these 2 efficiently?
   setOperationAction(ISD::SETCC,            MVT::i32, Expand);
index 087da0b0c4d29ca0375de264e2c8b85613c483d9..fe116b6f790b2e2eb5e8191784b2789a2418d7fe 100644 (file)
@@ -85,7 +85,13 @@ void SystemZRegisterInfo::
 eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
                               MachineBasicBlock::iterator I) const {
   if (!hasReservedCallFrame(MF)) {
-    assert(0 && "Not implemented yet!");
+    // If the stack pointer can be changed after prologue, turn the
+    // adjcallstackup instruction into a 'sub R15, <amt>' and the
+    // adjcallstackdown instruction into 'add R15, <amt>'
+    MachineInstr *Old = I;
+    uint64_t Amount = Old->getOperand(0).getImm();
+
+    assert((Amount == 0) && "Not implemented yet!");
   }
 
   MBB.erase(I);
diff --git a/test/CodeGen/SystemZ/09-DynamicAlloca.ll b/test/CodeGen/SystemZ/09-DynamicAlloca.ll
new file mode 100644 (file)
index 0000000..cc8b8d1
--- /dev/null
@@ -0,0 +1,14 @@
+; RUN: llvm-as < %s | llc
+
+target datalayout = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16"
+target triple = "s390x-linux"
+
+define void @foo(i64 %N) nounwind {
+entry:
+       %N3 = trunc i64 %N to i32               ; <i32> [#uses=1]
+       %vla = alloca i8, i32 %N3, align 2              ; <i8*> [#uses=1]
+       call void @bar(i8* %vla) nounwind
+       ret void
+}
+
+declare void @bar(i8*)