forked from OSchip/llvm-project
Don't insert stackrestore on deoptimizing returns
They're not necessary (since the stack pointer is trivially restored on return), and the way LLVM inserts the stackrestore calls breaks the IR (we get a stackrestore between the deoptimize call and the return). llvm-svn: 265101
This commit is contained in:
parent
18b92968ea
commit
f83ab6de56
|
@ -1731,10 +1731,12 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI,
|
|||
// Insert a call to llvm.stackrestore before any return instructions in the
|
||||
// inlined function.
|
||||
for (ReturnInst *RI : Returns) {
|
||||
// Don't insert llvm.stackrestore calls between a musttail call and a
|
||||
// return. The return will restore the stack pointer.
|
||||
// Don't insert llvm.stackrestore calls between a musttail or deoptimize
|
||||
// call and a return. The return will restore the stack pointer.
|
||||
if (InlinedMustTailCalls && RI->getParent()->getTerminatingMustTailCall())
|
||||
continue;
|
||||
if (InlinedDeoptimizeCalls && RI->getParent()->getTerminatingDeoptimizeCall())
|
||||
continue;
|
||||
IRBuilder<>(RI).CreateCall(StackRestore, SavedPtr);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -104,3 +104,19 @@ entry:
|
|||
call i8 @callee_with_alloca();
|
||||
ret void
|
||||
}
|
||||
|
||||
define i8 @callee_with_dynamic_alloca(i32 %n) alwaysinline {
|
||||
%p = alloca i8, i32 %n
|
||||
%v = call i8(...) @llvm.experimental.deoptimize.i8(i32 1) [ "deopt"(i8* %p) ]
|
||||
ret i8 %v
|
||||
}
|
||||
|
||||
define void @caller_with_stacksaverestore(i32 %n) {
|
||||
; CHECK-LABEL: void @caller_with_stacksaverestore(
|
||||
; CHECK: call void (...) @llvm.experimental.deoptimize.isVoid(i32 1) [ "deopt"(i8* %p.i) ]
|
||||
; CHECK-NEXT: ret void
|
||||
|
||||
%p = alloca i32, i32 %n
|
||||
call i8 @callee_with_dynamic_alloca(i32 %n)
|
||||
ret void
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue