[llvm] r265502 - Lower @llvm.experimental.deoptimize as a noreturn call
Sanjoy Das via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 5 18:33:50 PDT 2016
Author: sanjoy
Date: Tue Apr 5 20:33:49 2016
New Revision: 265502
URL: http://llvm.org/viewvc/llvm-project?rev=265502&view=rev
Log:
Lower @llvm.experimental.deoptimize as a noreturn call
While preserving the return value for @llvm.experimental.deoptimize at
the IR level is useful during mid-level optimization, doing so at the
machine instruction level requires generating some extra code and a
return that is non-ideal. This change has LLVM lower
```
%val = call @llvm.experimental.deoptimize
ret %val
```
to effectively
```
call @__llvm_deoptimize()
unreachable
```
instead.
Modified:
llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h
llvm/trunk/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
llvm/trunk/test/CodeGen/X86/deopt-intrinsic.ll
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=265502&r1=265501&r2=265502&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Tue Apr 5 20:33:49 2016
@@ -1377,6 +1377,18 @@ void SelectionDAGBuilder::visitRet(const
SmallVector<ISD::OutputArg, 8> Outs;
SmallVector<SDValue, 8> OutVals;
+ // Calls to @llvm.experimental.deoptimize don't generate a return value, so
+ // lower
+ //
+ // %val = call <ty> @llvm.experimental.deoptimize()
+ // ret <ty> %val
+ //
+ // differently.
+ if (I.getParent()->getTerminatingDeoptimizeCall()) {
+ LowerDeoptimizingReturn();
+ return;
+ }
+
if (!FuncInfo.CanLowerReturn) {
unsigned DemoteReg = FuncInfo.DemoteRegister;
const Function *F = I.getParent()->getParent();
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h?rev=265502&r1=265501&r2=265502&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h Tue Apr 5 20:33:49 2016
@@ -779,10 +779,12 @@ public:
const BasicBlock *EHPadBB);
void LowerDeoptimizeCall(const CallInst *CI);
+ void LowerDeoptimizingReturn();
void LowerCallSiteWithDeoptBundleImpl(ImmutableCallSite CS, SDValue Callee,
const BasicBlock *EHPadBB,
- bool VarArgDisallowed);
+ bool VarArgDisallowed,
+ bool ForceVoidReturnTy);
private:
// Terminator instructions.
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/StatepointLowering.cpp?rev=265502&r1=265501&r2=265502&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/StatepointLowering.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/StatepointLowering.cpp Tue Apr 5 20:33:49 2016
@@ -823,11 +823,13 @@ SelectionDAGBuilder::LowerStatepoint(Imm
void SelectionDAGBuilder::LowerCallSiteWithDeoptBundleImpl(
ImmutableCallSite CS, SDValue Callee, const BasicBlock *EHPadBB,
- bool VarArgDisallowed) {
+ bool VarArgDisallowed, bool ForceVoidReturnTy) {
StatepointLoweringInfo SI(DAG);
unsigned ArgBeginIndex = CS.arg_begin() - CS.getInstruction()->op_begin();
- populateCallLoweringInfo(SI.CLI, CS, ArgBeginIndex, CS.getNumArgOperands(),
- Callee, CS.getType(), false);
+ populateCallLoweringInfo(
+ SI.CLI, CS, ArgBeginIndex, CS.getNumArgOperands(), Callee,
+ ForceVoidReturnTy ? Type::getVoidTy(*DAG.getContext()) : CS.getType(),
+ false);
if (!VarArgDisallowed)
SI.CLI.IsVarArg = CS.getFunctionType()->isVarArg();
@@ -856,7 +858,8 @@ void SelectionDAGBuilder::LowerCallSiteW
void SelectionDAGBuilder::LowerCallSiteWithDeoptBundle(
ImmutableCallSite CS, SDValue Callee, const BasicBlock *EHPadBB) {
LowerCallSiteWithDeoptBundleImpl(CS, Callee, EHPadBB,
- /* VarArgDisallowed = */ false);
+ /* VarArgDisallowed = */ false,
+ /* ForceVoidReturnTy = */ false);
}
void SelectionDAGBuilder::visitGCResult(const CallInst &CI) {
@@ -941,7 +944,18 @@ void SelectionDAGBuilder::LowerDeoptimiz
TLI.getPointerTy(DAG.getDataLayout()));
// We don't lower calls to __llvm_deoptimize as varargs, but as a regular
- // call.
+ // call. We also do not lower the return value to any virtual register, and
+ // change the immediately following return to a trap instruction.
LowerCallSiteWithDeoptBundleImpl(CI, Callee, /* EHPadBB = */ nullptr,
- /* VarArgDisallowed = */ true);
+ /* VarArgDisallowed = */ true,
+ /* ForceVoidReturnTy = */ true);
+}
+
+void SelectionDAGBuilder::LowerDeoptimizingReturn() {
+ // We do not lower the return value from llvm.deoptimize to any virtual
+ // register, and change the immediately following return to a trap
+ // instruction.
+ if (DAG.getTarget().Options.TrapUnreachable)
+ DAG.setRoot(
+ DAG.getNode(ISD::TRAP, getCurSDLoc(), MVT::Other, DAG.getRoot()));
}
Modified: llvm/trunk/test/CodeGen/X86/deopt-intrinsic.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/deopt-intrinsic.ll?rev=265502&r1=265501&r2=265502&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/deopt-intrinsic.ll (original)
+++ llvm/trunk/test/CodeGen/X86/deopt-intrinsic.ll Tue Apr 5 20:33:49 2016
@@ -18,8 +18,6 @@ define i32 @caller_0() {
; CHECK-NEXT: {{.+cfi.+}}
; CHECK-NEXT: callq ___llvm_deoptimize
; CHECK-NEXT: {{Ltmp[0-9]+}}:
-; CHECK-NEXT: popq %rcx
-; CHECK-NEXT: retq
entry:
%v = call i32(...) @llvm.experimental.deoptimize.i32() [ "deopt"(i32 0) ]
ret i32 %v
@@ -36,8 +34,6 @@ define i8 @caller_1() {
; CHECK-NEXT: movl $42, %edi
; CHECK-NEXT: callq ___llvm_deoptimize
; CHECK-NEXT: {{Ltmp[0-9]+}}:
-; CHECK-NEXT: popq %rcx
-; CHECK-NEXT: retq
entry:
%v = call i8(...) @llvm.experimental.deoptimize.i8(i32 42, float 500.0) [ "deopt"(i32 1) ]
@@ -55,8 +51,6 @@ define i64 @caller_2() {
; CHECK-NEXT: movl $42, %eax
; CHECK-NEXT: callq ___llvm_deoptimize
; CHECK-NEXT: {{Ltmp[0-9]+}}:
-; CHECK-NEXT: popq %rcx
-; CHECK-NEXT: retq
entry:
%v = call webkit_jscc i64(...) @llvm.experimental.deoptimize.i64(i32 42, float 500.0) [ "deopt"(i32 3) ]
More information about the llvm-commits
mailing list