]> granicus.if.org Git - llvm/commitdiff
[GlobalISel] Add IRTranslator support for llvm.stacksave and llvm.stackrestore
authorJessica Paquette <jpaquette@apple.com>
Tue, 2 Apr 2019 22:46:31 +0000 (22:46 +0000)
committerJessica Paquette <jpaquette@apple.com>
Tue, 2 Apr 2019 22:46:31 +0000 (22:46 +0000)
Also update arm64-irtranslator.ll.

Differential Revision: https://reviews.llvm.org/D60140

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

lib/CodeGen/GlobalISel/IRTranslator.cpp
test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll

index 8528636a67da98fe645c4f10eca9418e9da895bd..f60f7845655d60f10099e75703c9462832aeabc3 100644 (file)
@@ -1046,6 +1046,34 @@ bool IRTranslator::translateKnownIntrinsic(const CallInst &CI, Intrinsic::ID ID,
                                   PtrTy.getSizeInBits() / 8, 8));
     return true;
   }
+  case Intrinsic::stacksave: {
+    // Save the stack pointer to the location provided by the intrinsic.
+    unsigned Reg = getOrCreateVReg(CI);
+    unsigned StackPtr = MF->getSubtarget()
+                            .getTargetLowering()
+                            ->getStackPointerRegisterToSaveRestore();
+
+    // If the target doesn't specify a stack pointer, then fall back.
+    if (!StackPtr)
+      return false;
+
+    MIRBuilder.buildCopy(Reg, StackPtr);
+    return true;
+  }
+  case Intrinsic::stackrestore: {
+    // Restore the stack pointer from the location provided by the intrinsic.
+    unsigned Reg = getOrCreateVReg(*CI.getArgOperand(0));
+    unsigned StackPtr = MF->getSubtarget()
+                            .getTargetLowering()
+                            ->getStackPointerRegisterToSaveRestore();
+
+    // If the target doesn't specify a stack pointer, then fall back.
+    if (!StackPtr)
+      return false;
+
+    MIRBuilder.buildCopy(StackPtr, Reg);
+    return true;
+  }
   case Intrinsic::cttz:
   case Intrinsic::ctlz: {
     ConstantInt *Cst = cast<ConstantInt>(CI.getArgOperand(1));
index 2e02ec057f08a244475793b03460be06c40e0bdc..376b2ad8caba5e0ab46105073e257ce55cdc2a27 100644 (file)
@@ -2359,3 +2359,15 @@ define void @test_i1_arg_zext(void (i1)* %f) {
   call void %f(i1 true)
   ret void
 }
+
+declare i8* @llvm.stacksave()
+declare void @llvm.stackrestore(i8*)
+define void @test_stacksaverestore() {
+  ; CHECK-LABEL: name: test_stacksaverestore
+  ; CHECK: [[SAVE:%[0-9]+]]:_(p0) = COPY $sp
+  ; CHECK-NEXT: $sp = COPY [[SAVE]](p0)
+  ; CHECK-NEXT: RET_ReallyLR
+  %sp = call i8* @llvm.stacksave()
+  call void @llvm.stackrestore(i8* %sp)
+  ret void
+}