From ed23352379c83f0d30fbaa1770af4dd8d06a50c6 Mon Sep 17 00:00:00 2001 From: Jessica Paquette Date: Tue, 2 Apr 2019 22:46:31 +0000 Subject: [PATCH] [GlobalISel] Add IRTranslator support for llvm.stacksave and llvm.stackrestore Also update arm64-irtranslator.ll. Differential Revision: https://reviews.llvm.org/D60140 llvm-svn: 357538 --- llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 28 ++++++++++++++++++++++ .../AArch64/GlobalISel/arm64-irtranslator.ll | 12 ++++++++++ 2 files changed, 40 insertions(+) diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index 8528636..f60f784 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/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/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll index 2e02ec0..376b2ad8 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll +++ b/llvm/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 +} -- 2.7.4