@@ -8636,6 +8636,16 @@ static void analyzeCallOperands(const AArch64TargetLowering &TLI,
8636
8636
}
8637
8637
}
8638
8638
8639
+ static SMECallAttrs
8640
+ getSMECallAttrs(const Function &Function,
8641
+ const TargetLowering::CallLoweringInfo &CLI) {
8642
+ if (CLI.CB)
8643
+ return SMECallAttrs(*CLI.CB);
8644
+ if (auto *ES = dyn_cast<ExternalSymbolSDNode>(CLI.Callee))
8645
+ return SMECallAttrs(SMEAttrs(Function), SMEAttrs(ES->getSymbol()));
8646
+ return SMECallAttrs(SMEAttrs(Function), SMEAttrs(SMEAttrs::Normal));
8647
+ }
8648
+
8639
8649
bool AArch64TargetLowering::isEligibleForTailCallOptimization(
8640
8650
const CallLoweringInfo &CLI) const {
8641
8651
CallingConv::ID CalleeCC = CLI.CallConv;
@@ -8654,12 +8664,10 @@ bool AArch64TargetLowering::isEligibleForTailCallOptimization(
8654
8664
8655
8665
// SME Streaming functions are not eligible for TCO as they may require
8656
8666
// the streaming mode or ZA to be restored after returning from the call.
8657
- SMEAttrs CallerAttrs(MF.getFunction());
8658
- auto CalleeAttrs = CLI.CB ? SMEAttrs(*CLI.CB) : SMEAttrs(SMEAttrs::Normal);
8659
- if (CallerAttrs.requiresSMChange(CalleeAttrs) ||
8660
- CallerAttrs.requiresLazySave(CalleeAttrs) ||
8661
- CallerAttrs.requiresPreservingAllZAState(CalleeAttrs) ||
8662
- CallerAttrs.hasStreamingBody())
8667
+ SMECallAttrs CallAttrs = getSMECallAttrs(CallerF, CLI);
8668
+ if (CallAttrs.requiresSMChange() || CallAttrs.requiresLazySave() ||
8669
+ CallAttrs.requiresPreservingAllZAState() ||
8670
+ CallAttrs.caller().hasStreamingBody())
8663
8671
return false;
8664
8672
8665
8673
// Functions using the C or Fast calling convention that have an SVE signature
@@ -8951,14 +8959,13 @@ static SDValue emitSMEStateSaveRestore(const AArch64TargetLowering &TLI,
8951
8959
return TLI.LowerCallTo(CLI).second;
8952
8960
}
8953
8961
8954
- static unsigned getSMCondition(const SMEAttrs &CallerAttrs,
8955
- const SMEAttrs &CalleeAttrs) {
8956
- if (!CallerAttrs.hasStreamingCompatibleInterface() ||
8957
- CallerAttrs.hasStreamingBody())
8962
+ static unsigned getSMCondition(const SMECallAttrs &CallAttrs) {
8963
+ if (!CallAttrs.caller().hasStreamingCompatibleInterface() ||
8964
+ CallAttrs.caller().hasStreamingBody())
8958
8965
return AArch64SME::Always;
8959
- if (CalleeAttrs .hasNonStreamingInterface())
8966
+ if (CallAttrs.callee() .hasNonStreamingInterface())
8960
8967
return AArch64SME::IfCallerIsStreaming;
8961
- if (CalleeAttrs .hasStreamingInterface())
8968
+ if (CallAttrs.callee() .hasStreamingInterface())
8962
8969
return AArch64SME::IfCallerIsNonStreaming;
8963
8970
8964
8971
llvm_unreachable("Unsupported attributes");
@@ -9091,11 +9098,7 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
9091
9098
}
9092
9099
9093
9100
// Determine whether we need any streaming mode changes.
9094
- SMEAttrs CalleeAttrs, CallerAttrs(MF.getFunction());
9095
- if (CLI.CB)
9096
- CalleeAttrs = SMEAttrs(*CLI.CB);
9097
- else if (auto *ES = dyn_cast<ExternalSymbolSDNode>(CLI.Callee))
9098
- CalleeAttrs = SMEAttrs(ES->getSymbol());
9101
+ SMECallAttrs CallAttrs = getSMECallAttrs(MF.getFunction(), CLI);
9099
9102
9100
9103
auto DescribeCallsite =
9101
9104
[&](OptimizationRemarkAnalysis &R) -> OptimizationRemarkAnalysis & {
@@ -9110,9 +9113,8 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
9110
9113
return R;
9111
9114
};
9112
9115
9113
- bool RequiresLazySave = CallerAttrs.requiresLazySave(CalleeAttrs);
9114
- bool RequiresSaveAllZA =
9115
- CallerAttrs.requiresPreservingAllZAState(CalleeAttrs);
9116
+ bool RequiresLazySave = CallAttrs.requiresLazySave();
9117
+ bool RequiresSaveAllZA = CallAttrs.requiresPreservingAllZAState();
9116
9118
if (RequiresLazySave) {
9117
9119
const TPIDR2Object &TPIDR2 = FuncInfo->getTPIDR2Obj();
9118
9120
MachinePointerInfo MPI =
@@ -9140,18 +9142,18 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
9140
9142
return DescribeCallsite(R) << " sets up a lazy save for ZA";
9141
9143
});
9142
9144
} else if (RequiresSaveAllZA) {
9143
- assert(!CalleeAttrs .hasSharedZAInterface() &&
9145
+ assert(!CallAttrs.callee() .hasSharedZAInterface() &&
9144
9146
"Cannot share state that may not exist");
9145
9147
Chain = emitSMEStateSaveRestore(*this, DAG, FuncInfo, DL, Chain,
9146
9148
/*IsSave=*/true);
9147
9149
}
9148
9150
9149
9151
SDValue PStateSM;
9150
- bool RequiresSMChange = CallerAttrs .requiresSMChange(CalleeAttrs );
9152
+ bool RequiresSMChange = CallAttrs .requiresSMChange();
9151
9153
if (RequiresSMChange) {
9152
- if (CallerAttrs .hasStreamingInterfaceOrBody())
9154
+ if (CallAttrs.caller() .hasStreamingInterfaceOrBody())
9153
9155
PStateSM = DAG.getConstant(1, DL, MVT::i64);
9154
- else if (CallerAttrs .hasNonStreamingInterface())
9156
+ else if (CallAttrs.caller() .hasNonStreamingInterface())
9155
9157
PStateSM = DAG.getConstant(0, DL, MVT::i64);
9156
9158
else
9157
9159
PStateSM = getRuntimePStateSM(DAG, Chain, DL, MVT::i64);
@@ -9168,7 +9170,7 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
9168
9170
9169
9171
SDValue ZTFrameIdx;
9170
9172
MachineFrameInfo &MFI = MF.getFrameInfo();
9171
- bool ShouldPreserveZT0 = CallerAttrs .requiresPreservingZT0(CalleeAttrs );
9173
+ bool ShouldPreserveZT0 = CallAttrs .requiresPreservingZT0();
9172
9174
9173
9175
// If the caller has ZT0 state which will not be preserved by the callee,
9174
9176
// spill ZT0 before the call.
@@ -9184,7 +9186,7 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
9184
9186
9185
9187
// If caller shares ZT0 but the callee is not shared ZA, we need to stop
9186
9188
// PSTATE.ZA before the call if there is no lazy-save active.
9187
- bool DisableZA = CallerAttrs .requiresDisablingZABeforeCall(CalleeAttrs );
9189
+ bool DisableZA = CallAttrs .requiresDisablingZABeforeCall();
9188
9190
assert((!DisableZA || !RequiresLazySave) &&
9189
9191
"Lazy-save should have PSTATE.SM=1 on entry to the function");
9190
9192
@@ -9466,9 +9468,9 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
9466
9468
InGlue = Chain.getValue(1);
9467
9469
}
9468
9470
9469
- SDValue NewChain = changeStreamingMode(
9470
- DAG, DL, CalleeAttrs. hasStreamingInterface(), Chain, InGlue ,
9471
- getSMCondition(CallerAttrs, CalleeAttrs ), PStateSM);
9471
+ SDValue NewChain =
9472
+ changeStreamingMode( DAG, DL, CallAttrs.callee(). hasStreamingInterface(),
9473
+ Chain, InGlue, getSMCondition(CallAttrs ), PStateSM);
9472
9474
Chain = NewChain.getValue(0);
9473
9475
InGlue = NewChain.getValue(1);
9474
9476
}
@@ -9647,8 +9649,8 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
9647
9649
if (RequiresSMChange) {
9648
9650
assert(PStateSM && "Expected a PStateSM to be set");
9649
9651
Result = changeStreamingMode(
9650
- DAG, DL, !CalleeAttrs .hasStreamingInterface(), Result, InGlue,
9651
- getSMCondition(CallerAttrs, CalleeAttrs ), PStateSM);
9652
+ DAG, DL, !CallAttrs.callee() .hasStreamingInterface(), Result, InGlue,
9653
+ getSMCondition(CallAttrs ), PStateSM);
9652
9654
9653
9655
if (!Subtarget->isTargetDarwin() || Subtarget->hasSVE()) {
9654
9656
InGlue = Result.getValue(1);
@@ -9658,7 +9660,7 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
9658
9660
}
9659
9661
}
9660
9662
9661
- if (CallerAttrs .requiresEnablingZAAfterCall(CalleeAttrs ))
9663
+ if (CallAttrs .requiresEnablingZAAfterCall())
9662
9664
// Unconditionally resume ZA.
9663
9665
Result = DAG.getNode(
9664
9666
AArch64ISD::SMSTART, DL, MVT::Other, Result,
@@ -28518,12 +28520,10 @@ bool AArch64TargetLowering::fallBackToDAGISel(const Instruction &Inst) const {
28518
28520
28519
28521
// Checks to allow the use of SME instructions
28520
28522
if (auto *Base = dyn_cast<CallBase>(&Inst)) {
28521
- auto CallerAttrs = SMEAttrs(*Inst.getFunction());
28522
- auto CalleeAttrs = SMEAttrs(*Base);
28523
- if (CallerAttrs.requiresSMChange(CalleeAttrs) ||
28524
- CallerAttrs.requiresLazySave(CalleeAttrs) ||
28525
- CallerAttrs.requiresPreservingZT0(CalleeAttrs) ||
28526
- CallerAttrs.requiresPreservingAllZAState(CalleeAttrs))
28523
+ auto CallAttrs = SMECallAttrs(*Base);
28524
+ if (CallAttrs.requiresSMChange() || CallAttrs.requiresLazySave() ||
28525
+ CallAttrs.requiresPreservingZT0() ||
28526
+ CallAttrs.requiresPreservingAllZAState())
28527
28527
return true;
28528
28528
}
28529
28529
return false;
0 commit comments