[llvm] 65f6881 - [PowerPC] update PPCTTIImpl::supportsTailCallFor() check conditions
Ting Wang via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 28 19:29:48 PST 2023
Author: Ting Wang
Date: 2023-02-28T22:29:16-05:00
New Revision: 65f68812d399930d4af587c7a2333e46f367c5a7
URL: https://github.com/llvm/llvm-project/commit/65f68812d399930d4af587c7a2333e46f367c5a7
DIFF: https://github.com/llvm/llvm-project/commit/65f68812d399930d4af587c7a2333e46f367c5a7.diff
LOG: [PowerPC] update PPCTTIImpl::supportsTailCallFor() check conditions
This patch reuse `PPCTargetLowering::isEligibleForTCO()` to check
`PPCTTIImpl::supportsTailCallFor()`.
Fixes #59315
Reviewed By: shchenz
Differential Revision: https://reviews.llvm.org/D140369
Added:
Modified:
llvm/lib/Target/PowerPC/PPCISelLowering.cpp
llvm/lib/Target/PowerPC/PPCISelLowering.h
llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp
llvm/test/Transforms/Coroutines/coro-split-musttail-ppc64le.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
index cf72e379a69e8..cba5f5cd42f59 100644
--- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
+++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
@@ -5651,6 +5651,27 @@ SDValue PPCTargetLowering::FinishCall(
DAG, InVals);
}
+bool PPCTargetLowering::supportsTailCallFor(const CallBase *CB) const {
+ CallingConv::ID CalleeCC = CB->getCallingConv();
+ const Function *CallerFunc = CB->getCaller();
+ CallingConv::ID CallerCC = CallerFunc->getCallingConv();
+ const Function *CalleeFunc = CB->getCalledFunction();
+ if (!CalleeFunc)
+ return false;
+ const GlobalValue *CalleeGV = dyn_cast<GlobalValue>(CalleeFunc);
+
+ SmallVector<ISD::OutputArg, 2> Outs;
+ SmallVector<ISD::InputArg, 2> Ins;
+
+ GetReturnInfo(CalleeCC, CalleeFunc->getReturnType(),
+ CalleeFunc->getAttributes(), Outs, *this,
+ CalleeFunc->getParent()->getDataLayout());
+
+ return isEligibleForTCO(
+ CalleeGV, CalleeCC, CallerCC, CB, CalleeFunc->isVarArg(), Outs, Ins,
+ false /*IsByValArg*/, CallerFunc, false /*isCalleeExternalSymbol*/);
+}
+
bool PPCTargetLowering::isEligibleForTCO(
const GlobalValue *CalleeGV, CallingConv::ID CalleeCC,
CallingConv::ID CallerCC, const CallBase *CB, bool isVarArg,
diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.h b/llvm/lib/Target/PowerPC/PPCISelLowering.h
index 302bd1b91ecc1..3401d7db45f84 100644
--- a/llvm/lib/Target/PowerPC/PPCISelLowering.h
+++ b/llvm/lib/Target/PowerPC/PPCISelLowering.h
@@ -1172,6 +1172,7 @@ namespace llvm {
CCAssignFn *ccAssignFnForCall(CallingConv::ID CC, bool Return,
bool IsVarArg) const;
+ bool supportsTailCallFor(const CallBase *CB) const;
private:
struct ReuseLoadInfo {
diff --git a/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp b/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp
index 69f2bbffc6352..8137b61f4982b 100644
--- a/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp
+++ b/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp
@@ -1079,17 +1079,5 @@ InstructionCost PPCTTIImpl::getVPMemoryOpCost(unsigned Opcode, Type *Src,
}
bool PPCTTIImpl::supportsTailCallFor(const CallBase *CB) const {
- // Subtargets using PC-Relative addressing supported.
- if (ST->isUsingPCRelativeCalls())
- return true;
-
- const Function *Callee = CB->getCalledFunction();
- // Indirect calls and variadic argument functions not supported.
- if (!Callee || Callee->isVarArg())
- return false;
-
- const Function *Caller = CB->getCaller();
- // Support if we can share TOC base.
- return ST->getTargetMachine().shouldAssumeDSOLocal(*Caller->getParent(),
- Callee);
+ return TLI->supportsTailCallFor(CB);
}
diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail-ppc64le.ll b/llvm/test/Transforms/Coroutines/coro-split-musttail-ppc64le.ll
index ddb8e5946e3ca..41787c4a31ea9 100644
--- a/llvm/test/Transforms/Coroutines/coro-split-musttail-ppc64le.ll
+++ b/llvm/test/Transforms/Coroutines/coro-split-musttail-ppc64le.ll
@@ -3,7 +3,12 @@
; RUN: -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 | FileCheck %s
; RUN: opt < %s -passes='cgscc(coro-split),simplifycfg,early-cse' -S \
; RUN: -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr10 --code-model=medium \
-; RUN: | FileCheck %s --check-prefix=CHECK-PCREL
+; RUN: | FileCheck %s
+; RUN: opt < %s -passes='cgscc(coro-split),simplifycfg,early-cse' -S \
+; RUN: -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr10 --code-model=medium -mattr=+longcall \
+; RUN: | FileCheck %s
+; RUN: opt < %s -passes='cgscc(coro-split),simplifycfg,early-cse' -S \
+; RUN: -mtriple=ppc32-- | FileCheck %s
define void @f() #0 {
entry:
@@ -45,12 +50,6 @@ exit:
; CHECK: %[[addr2:.+]] = call ptr @llvm.coro.subfn.addr(ptr null, i8 0)
; CHECK-NEXT: call fastcc void %[[addr2]](ptr null)
-; Verify that ppc target using PC-Relative addressing in the resume part resume call is marked with musttail.
-; CHECK-PCREL-LABEL: @f.resume(
-; CHECK-PCREL: %[[addr2:.+]] = call ptr @llvm.coro.subfn.addr(ptr null, i8 0)
-; CHECK-PCREL-NEXT: musttail call fastcc void %[[addr2]](ptr null)
-; CHECK-PCREL-NEXT: ret void
-
declare token @llvm.coro.id(i32, ptr readnone, ptr nocapture readonly, ptr) #1
declare i1 @llvm.coro.alloc(token) #2
declare i64 @llvm.coro.size.i64() #3
More information about the llvm-commits
mailing list