diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -12745,7 +12745,6 @@ CCState &CCInfo, CallLoweringInfo &CLI, MachineFunction &MF, const SmallVector &ArgLocs) const { - auto &Callee = CLI.Callee; auto CalleeCC = CLI.CallConv; auto &Outs = CLI.Outs; auto &Caller = MF.getFunction(); @@ -12782,16 +12781,6 @@ if (IsCallerStructRet || IsCalleeStructRet) return false; - // Externally-defined functions with weak linkage should not be - // tail-called. The behaviour of branch instructions in this situation (as - // used for tail calls) is implementation-defined, so we cannot rely on the - // linker replacing the tail call with a return. - if (GlobalAddressSDNode *G = dyn_cast(Callee)) { - const GlobalValue *GV = G->getGlobal(); - if (GV->hasExternalWeakLinkage()) - return false; - } - // The callee has to preserve all registers the caller needs to preserve. const RISCVRegisterInfo *TRI = Subtarget.getRegisterInfo(); const uint32_t *CallerPreserved = TRI->getCallPreservedMask(MF, CallerCC); diff --git a/llvm/test/CodeGen/RISCV/tail-calls.ll b/llvm/test/CodeGen/RISCV/tail-calls.ll --- a/llvm/test/CodeGen/RISCV/tail-calls.ll +++ b/llvm/test/CodeGen/RISCV/tail-calls.ll @@ -109,15 +109,11 @@ ret void } -; Externally-defined functions with weak linkage should not be tail-called. -; The behaviour of branch instructions in this situation (as used for tail -; calls) is implementation-defined, so we cannot rely on the linker replacing -; the tail call with a return. +; Perform tail call optimization for external weak symbol. declare extern_weak void @callee_weak() define void @caller_weak() nounwind { ; CHECK-LABEL: caller_weak -; CHECK-NOT: tail callee_weak -; CHECK: call callee_weak +; CHECK: tail callee_weak entry: tail call void @callee_weak() ret void