diff options
author | Jessica Paquette <jpaquette@apple.com> | 2019-04-02 22:46:31 +0000 |
---|---|---|
committer | Jessica Paquette <jpaquette@apple.com> | 2019-04-02 22:46:31 +0000 |
commit | ed23352379c83f0d30fbaa1770af4dd8d06a50c6 (patch) | |
tree | 0e47ffe0cd359613694d4a1beaf2e350e6159b42 | |
parent | ea2e2279269319ca47d4767e8dc5984aa8a5ee35 (diff) | |
download | bcm5719-llvm-ed23352379c83f0d30fbaa1770af4dd8d06a50c6.tar.gz bcm5719-llvm-ed23352379c83f0d30fbaa1770af4dd8d06a50c6.zip |
[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
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 28 | ||||
-rw-r--r-- | llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll | 12 |
2 files changed, 40 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index 8528636a67d..f60f7845655 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<ConstantInt>(CI.getArgOperand(1)); diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll index 2e02ec057f0..376b2ad8cab 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 +} |