Skip to content

Commit

Permalink
[CodeGen] Fix nomerge attribute not working in tail calls.
Browse files Browse the repository at this point in the history
In D79537, `nomerge` was made to only apply to non-tail calls. This fixes it by also applying it to tail calls.

For ARM, I only made the new MI to inherit the flag under `TCRETURNdi` and `TCRETURNri`, because that's the place tail calls got replaced. Not sure if there's any other place needed.

Fixes #61545.

Reviewed By: rnk

Differential Revision: https://reviews.llvm.org/D146749
  • Loading branch information
ZequanWu committed May 10, 2023
1 parent 2ec334d commit 3977b77
Show file tree
Hide file tree
Showing 14 changed files with 40 additions and 5 deletions.
1 change: 1 addition & 0 deletions llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
Expand Up @@ -7599,6 +7599,7 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
if (IsCFICall)
Ret.getNode()->setCFIType(CLI.CFIType->getZExtValue());

DAG.addNoMergeSiteInfo(Ret.getNode(), CLI.NoMerge);
DAG.addCallSiteInfo(Ret.getNode(), std::move(CSInfo));
return Ret;
}
Expand Down
3 changes: 3 additions & 0 deletions llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp
Expand Up @@ -2171,6 +2171,9 @@ bool ARMExpandPseudo::ExpandMI(MachineBasicBlock &MBB,
// Update call site info and delete the pseudo instruction TCRETURN.
if (MI.isCandidateForCallSiteEntry())
MI.getMF()->moveCallSiteInfo(&MI, &*NewMI);
// Copy nomerge flag over to new instruction.
if (MI.getFlag(MachineInstr::NoMerge))
NewMI->setFlag(MachineInstr::NoMerge);
MBB.erase(MBBI);

MBBI = NewMI;
Expand Down
1 change: 1 addition & 0 deletions llvm/lib/Target/ARM/ARMISelLowering.cpp
Expand Up @@ -2857,6 +2857,7 @@ ARMTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
if (isTailCall) {
MF.getFrameInfo().setHasTailCall();
SDValue Ret = DAG.getNode(ARMISD::TC_RETURN, dl, NodeTys, Ops);
DAG.addNoMergeSiteInfo(Ret.getNode(), CLI.NoMerge);
DAG.addCallSiteInfo(Ret.getNode(), std::move(CSInfo));
return Ret;
}
Expand Down
4 changes: 3 additions & 1 deletion llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
Expand Up @@ -2638,7 +2638,9 @@ LoongArchTargetLowering::LowerCall(CallLoweringInfo &CLI,

if (IsTailCall) {
MF.getFrameInfo().setHasTailCall();
return DAG.getNode(LoongArchISD::TAIL, DL, NodeTys, Ops);
SDValue Ret = DAG.getNode(LoongArchISD::TAIL, DL, NodeTys, Ops);
DAG.addNoMergeSiteInfo(Ret.getNode(), CLI.NoMerge);
return Ret;
}

Chain = DAG.getNode(LoongArchISD::CALL, DL, NodeTys, Ops);
Expand Down
4 changes: 3 additions & 1 deletion llvm/lib/Target/PowerPC/PPCISelLowering.cpp
Expand Up @@ -5629,7 +5629,9 @@ SDValue PPCTargetLowering::FinishCall(
assert(CallOpc == PPCISD::TC_RETURN &&
"Unexpected call opcode for a tail call.");
DAG.getMachineFunction().getFrameInfo().setHasTailCall();
return DAG.getNode(CallOpc, dl, MVT::Other, Ops);
SDValue Ret = DAG.getNode(CallOpc, dl, MVT::Other, Ops);
DAG.addNoMergeSiteInfo(Ret.getNode(), CFlags.NoMerge);
return Ret;
}

std::array<EVT, 2> ReturnTypes = {{MVT::Other, MVT::Glue}};
Expand Down
4 changes: 3 additions & 1 deletion llvm/lib/Target/RISCV/RISCVISelLowering.cpp
Expand Up @@ -14671,7 +14671,9 @@ SDValue RISCVTargetLowering::LowerCall(CallLoweringInfo &CLI,

if (IsTailCall) {
MF.getFrameInfo().setHasTailCall();
return DAG.getNode(RISCVISD::TAIL, DL, NodeTys, Ops);
SDValue Ret = DAG.getNode(RISCVISD::TAIL, DL, NodeTys, Ops);
DAG.addNoMergeSiteInfo(Ret.getNode(), CLI.NoMerge);
return Ret;
}

Chain = DAG.getNode(RISCVISD::CALL, DL, NodeTys, Ops);
Expand Down
7 changes: 5 additions & 2 deletions llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
Expand Up @@ -1849,8 +1849,11 @@ SystemZTargetLowering::LowerCall(CallLoweringInfo &CLI,

// Emit the call.
SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
if (IsTailCall)
return DAG.getNode(SystemZISD::SIBCALL, DL, NodeTys, Ops);
if (IsTailCall) {
SDValue Ret = DAG.getNode(SystemZISD::SIBCALL, DL, NodeTys, Ops);
DAG.addNoMergeSiteInfo(Ret.getNode(), CLI.NoMerge);
return Ret;
}
Chain = DAG.getNode(SystemZISD::CALL, DL, NodeTys, Ops);
DAG.addNoMergeSiteInfo(Chain.getNode(), CLI.NoMerge);
Glue = Chain.getValue(1);
Expand Down
1 change: 1 addition & 0 deletions llvm/lib/Target/X86/X86ISelLowering.cpp
Expand Up @@ -4984,6 +4984,7 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
if (IsCFICall)
Ret.getNode()->setCFIType(CLI.CFIType->getZExtValue());

DAG.addNoMergeSiteInfo(Ret.getNode(), CLI.NoMerge);
DAG.addCallSiteInfo(Ret.getNode(), std::move(CSInfo));
return Ret;
}
Expand Down
4 changes: 4 additions & 0 deletions llvm/test/CodeGen/AArch64/nomerge.ll
Expand Up @@ -41,6 +41,10 @@ if.end3:
define void @foo_tail(i1 %i) nounwind {
; CHECK-LABEL: foo_tail:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: tbz w0, #0, .LBB1_2
; CHECK-NEXT: // %bb.1: // %if.then
; CHECK-NEXT: b bar
; CHECK-NEXT: .LBB1_2: // %if.else
; CHECK-NEXT: b bar
entry:
br i1 %i, label %if.then, label %if.else
Expand Down
4 changes: 4 additions & 0 deletions llvm/test/CodeGen/ARM/nomerge.ll
Expand Up @@ -42,6 +42,10 @@ define void @foo_tail(i1 %i) nounwind {
; CHECK-LABEL: foo_tail:
; CHECK: @ %bb.0: @ %entry
; CHECK-NEXT: tst r0, #1
; CHECK-NEXT: beq .LBB1_2
; CHECK-NEXT: @ %bb.1: @ %if.then
; CHECK-NEXT: b bar
; CHECK-NEXT: .LBB1_2: @ %if.else
; CHECK-NEXT: b bar
entry:
br i1 %i, label %if.then, label %if.else
Expand Down
4 changes: 4 additions & 0 deletions llvm/test/CodeGen/LoongArch/nomerge.ll
Expand Up @@ -44,6 +44,10 @@ define void @foo_tail(i1 %i) nounwind {
; CHECK-LABEL: foo_tail:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: andi $a0, $a0, 1
; CHECK-NEXT: beqz $a0, .LBB1_2
; CHECK-NEXT: # %bb.1: # %if.then
; CHECK-NEXT: b %plt(bar)
; CHECK-NEXT: .LBB1_2: # %if.else
; CHECK-NEXT: b %plt(bar)
entry:
br i1 %i, label %if.then, label %if.else
Expand Down
4 changes: 4 additions & 0 deletions llvm/test/CodeGen/RISCV/nomerge.ll
Expand Up @@ -44,6 +44,10 @@ define void @foo_tail(i1 %i) nounwind {
; CHECK-LABEL: foo_tail:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: andi a0, a0, 1
; CHECK-NEXT: beqz a0, .LBB1_2
; CHECK-NEXT: # %bb.1: # %if.then
; CHECK-NEXT: tail bar@plt
; CHECK-NEXT: .LBB1_2: # %if.else
; CHECK-NEXT: tail bar@plt
entry:
br i1 %i, label %if.then, label %if.else
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/CodeGen/SystemZ/nomerge.ll
Expand Up @@ -41,6 +41,8 @@ define void @foo_tail(i1 %i) nounwind {
; CHECK-LABEL: foo_tail:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: tmll %r2, 1
; CHECK-NEXT: jge bar@PLT
; CHECK-NEXT: .LBB1_1: # %if.then
; CHECK-NEXT: jg bar@PLT
entry:
br i1 %i, label %if.then, label %if.else
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/CodeGen/X86/nomerge.ll
Expand Up @@ -42,6 +42,8 @@ define void @foo_tail(i1 %i) nounwind {
; CHECK-LABEL: foo_tail:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: testb $1, %dil
; CHECK-NEXT: je bar # TAILCALL
; CHECK-NEXT: # %bb.1: # %if.then
; CHECK-NEXT: jmp bar # TAILCALL
entry:
br i1 %i, label %if.then, label %if.else
Expand Down

0 comments on commit 3977b77

Please sign in to comment.