]> granicus.if.org Git - llvm/commitdiff
[SystemZ] Implement llvm.get.dynamic.area.offset
authorMarcin Koscielnicki <koriakin@0x04.net>
Wed, 4 May 2016 23:31:26 +0000 (23:31 +0000)
committerMarcin Koscielnicki <koriakin@0x04.net>
Wed, 4 May 2016 23:31:26 +0000 (23:31 +0000)
To be used for AddressSanitizer.

Differential Revision: http://reviews.llvm.org/D19817

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

lib/Target/SystemZ/SystemZISelDAGToDAG.cpp
lib/Target/SystemZ/SystemZISelLowering.cpp
lib/Target/SystemZ/SystemZISelLowering.h
test/CodeGen/SystemZ/dyn-alloca-offset.ll [new file with mode: 0644]

index a9093094d88497b8eead1383aa034489f78501e2..ddf7af73bc292502c1405d5392ff98f719a3a85c 100644 (file)
@@ -554,6 +554,10 @@ bool SystemZDAGToDAGISel::selectAddress(SDValue Addr,
       expandDisp(AM, true, SDValue(),
                  cast<ConstantSDNode>(Addr)->getSExtValue()))
     ;
+  // Also see if it's a bare ADJDYNALLOC.
+  else if (Addr.getOpcode() == SystemZISD::ADJDYNALLOC &&
+           expandAdjDynAlloc(AM, true, SDValue()))
+    ;
   else
     // Otherwise try expanding each component.
     while (expandAddress(AM, true) ||
index 097019511785745b04e87c86d93ea5a4ee11d94b..f656a2f00eddbce4571d27b19dddf13bbcfe3a32 100644 (file)
@@ -253,6 +253,7 @@ SystemZTargetLowering::SystemZTargetLowering(const TargetMachine &TM,
   // We need to handle dynamic allocations specially because of the
   // 160-byte area at the bottom of the stack.
   setOperationAction(ISD::DYNAMIC_STACKALLOC, PtrVT, Custom);
+  setOperationAction(ISD::GET_DYNAMIC_AREA_OFFSET, PtrVT, Custom);
 
   // Use custom expanders so that we can force the function to use
   // a frame pointer.
@@ -2900,6 +2901,13 @@ lowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const {
   return DAG.getMergeValues(Ops, DL);
 }
 
+SDValue SystemZTargetLowering::lowerGET_DYNAMIC_AREA_OFFSET(
+    SDValue Op, SelectionDAG &DAG) const {
+  SDLoc DL(Op);
+
+  return DAG.getNode(SystemZISD::ADJDYNALLOC, DL, MVT::i64);
+}
+
 SDValue SystemZTargetLowering::lowerSMUL_LOHI(SDValue Op,
                                               SelectionDAG &DAG) const {
   EVT VT = Op.getValueType();
@@ -4487,6 +4495,8 @@ SDValue SystemZTargetLowering::LowerOperation(SDValue Op,
     return lowerVACOPY(Op, DAG);
   case ISD::DYNAMIC_STACKALLOC:
     return lowerDYNAMIC_STACKALLOC(Op, DAG);
+  case ISD::GET_DYNAMIC_AREA_OFFSET:
+    return lowerGET_DYNAMIC_AREA_OFFSET(Op, DAG);
   case ISD::SMUL_LOHI:
     return lowerSMUL_LOHI(Op, DAG);
   case ISD::UMUL_LOHI:
index fe6966aafe209b84664aaa3feff71b96a6e67496..f26e1dc0d66256b157b47852e713519c3d308063 100644 (file)
@@ -487,6 +487,7 @@ private:
   SDValue lowerVASTART(SDValue Op, SelectionDAG &DAG) const;
   SDValue lowerVACOPY(SDValue Op, SelectionDAG &DAG) const;
   SDValue lowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
+  SDValue lowerGET_DYNAMIC_AREA_OFFSET(SDValue Op, SelectionDAG &DAG) const;
   SDValue lowerSMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
   SDValue lowerUMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
   SDValue lowerSDIVREM(SDValue Op, SelectionDAG &DAG) const;
diff --git a/test/CodeGen/SystemZ/dyn-alloca-offset.ll b/test/CodeGen/SystemZ/dyn-alloca-offset.ll
new file mode 100644 (file)
index 0000000..b9997ac
--- /dev/null
@@ -0,0 +1,42 @@
+; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
+
+declare i64 @llvm.get.dynamic.area.offset.i64()
+
+declare void @use(i64)
+
+define void @f1() {
+; CHECK-LABEL: f1
+; CHECK: la %r2, 160
+; CHECK: brasl %r14, use
+; CHECK: br %r14
+  %tmp = alloca i64, align 32
+  %dynamic_area_offset = call i64 @llvm.get.dynamic.area.offset.i64()
+  call void @use(i64 %dynamic_area_offset)
+  ret void
+}
+
+define void @f2(i64 %arg) {
+; CHECK-LABEL: f2
+; CHECK: la %r2, 160(%r2)
+; CHECK: brasl %r14, use
+; CHECK: br %r14
+  %tmp = alloca i64, align 32
+  %dynamic_area_offset = call i64 @llvm.get.dynamic.area.offset.i64()
+  %param = add i64 %dynamic_area_offset, %arg
+  call void @use(i64 %param)
+  ret void
+}
+
+declare void @eatsalot(i64, i64, i64, i64, i64, i64)
+
+define void @f3() {
+; CHECK-LABEL: f3
+; CHECK: la %r2, 168
+; CHECK: brasl %r14, use
+; CHECK: br %r14
+  %tmp = alloca i64, align 32
+  call void @eatsalot(i64 0, i64 0, i64 0, i64 0, i64 0, i64 0)
+  %dynamic_area_offset = call i64 @llvm.get.dynamic.area.offset.i64()
+  call void @use(i64 %dynamic_area_offset)
+  ret void
+}