From: Jessica Paquette Date: Tue, 2 Apr 2019 22:46:31 +0000 (+0000) Subject: [GlobalISel] Add IRTranslator support for llvm.stacksave and llvm.stackrestore X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b3e5d54b53ef66187aa8d9243db18f183cd11482;p=llvm [GlobalISel] Add IRTranslator support for llvm.stacksave and llvm.stackrestore 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 --- diff --git a/lib/CodeGen/GlobalISel/IRTranslator.cpp b/lib/CodeGen/GlobalISel/IRTranslator.cpp index 8528636a67d..f60f7845655 100644 --- a/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -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(CI.getArgOperand(1)); diff --git a/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll b/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll index 2e02ec057f0..376b2ad8cab 100644 --- a/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll +++ b/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll @@ -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 +}