Index: llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp =================================================================== --- llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -1046,6 +1046,34 @@ 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)); Index: llvm/trunk/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll =================================================================== --- llvm/trunk/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll +++ llvm/trunk/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll @@ -2359,3 +2359,15 @@ 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 +}