@@ -2407,8 +2407,8 @@ ARMTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
2407
2407
isTailCall = false;
2408
2408
2409
2409
// For both the non-secure calls and the returns from a CMSE entry function,
2410
- // the function needs to do some extra work afte r the call, or before the
2411
- // return, respectively, thus it cannot end with atail call
2410
+ // the function needs to do some extra work after the call, or before the
2411
+ // return, respectively, thus it cannot end with a tail call
2412
2412
if (isCmseNSCall || AFI->isCmseNSEntryFunction())
2413
2413
isTailCall = false;
2414
2414
@@ -2960,50 +2960,6 @@ void ARMTargetLowering::HandleByVal(CCState *State, unsigned &Size,
2960
2960
Size = std::max<int>(Size - Excess, 0);
2961
2961
}
2962
2962
2963
- /// MatchingStackOffset - Return true if the given stack call argument is
2964
- /// already available in the same position (relatively) of the caller's
2965
- /// incoming argument stack.
2966
- static
2967
- bool MatchingStackOffset(SDValue Arg, unsigned Offset, ISD::ArgFlagsTy Flags,
2968
- MachineFrameInfo &MFI, const MachineRegisterInfo *MRI,
2969
- const TargetInstrInfo *TII) {
2970
- unsigned Bytes = Arg.getValueSizeInBits() / 8;
2971
- int FI = std::numeric_limits<int>::max();
2972
- if (Arg.getOpcode() == ISD::CopyFromReg) {
2973
- Register VR = cast<RegisterSDNode>(Arg.getOperand(1))->getReg();
2974
- if (!VR.isVirtual())
2975
- return false;
2976
- MachineInstr *Def = MRI->getVRegDef(VR);
2977
- if (!Def)
2978
- return false;
2979
- if (!Flags.isByVal()) {
2980
- if (!TII->isLoadFromStackSlot(*Def, FI))
2981
- return false;
2982
- } else {
2983
- return false;
2984
- }
2985
- } else if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(Arg)) {
2986
- if (Flags.isByVal())
2987
- // ByVal argument is passed in as a pointer but it's now being
2988
- // dereferenced. e.g.
2989
- // define @foo(%struct.X* %A) {
2990
- // tail call @bar(%struct.X* byval %A)
2991
- // }
2992
- return false;
2993
- SDValue Ptr = Ld->getBasePtr();
2994
- FrameIndexSDNode *FINode = dyn_cast<FrameIndexSDNode>(Ptr);
2995
- if (!FINode)
2996
- return false;
2997
- FI = FINode->getIndex();
2998
- } else
2999
- return false;
3000
-
3001
- assert(FI != std::numeric_limits<int>::max());
3002
- if (!MFI.isFixedObjectIndex(FI))
3003
- return false;
3004
- return Offset == MFI.getObjectOffset(FI) && Bytes == MFI.getObjectSize(FI);
3005
- }
3006
-
3007
2963
/// IsEligibleForTailCallOptimization - Check whether the call is eligible
3008
2964
/// for tail call optimization. Targets which want to do tail call
3009
2965
/// optimization should implement this function. Note that this function also
@@ -3045,8 +3001,10 @@ bool ARMTargetLowering::IsEligibleForTailCallOptimization(
3045
3001
for (const CCValAssign &AL : ArgLocs)
3046
3002
if (AL.isRegLoc())
3047
3003
AddressRegisters.erase(AL.getLocReg());
3048
- if (AddressRegisters.empty())
3004
+ if (AddressRegisters.empty()) {
3005
+ LLVM_DEBUG(dbgs() << "false (no space for target address)\n");
3049
3006
return false;
3007
+ }
3050
3008
}
3051
3009
3052
3010
// Look for obvious safe cases to perform tail call optimization that do not
@@ -3055,18 +3013,26 @@ bool ARMTargetLowering::IsEligibleForTailCallOptimization(
3055
3013
// Exception-handling functions need a special set of instructions to indicate
3056
3014
// a return to the hardware. Tail-calling another function would probably
3057
3015
// break this.
3058
- if (CallerF.hasFnAttribute("interrupt"))
3016
+ if (CallerF.hasFnAttribute("interrupt")) {
3017
+ LLVM_DEBUG(dbgs() << "false (interrupt attribute)\n");
3059
3018
return false;
3019
+ }
3060
3020
3061
- if (canGuaranteeTCO(CalleeCC, getTargetMachine().Options.GuaranteedTailCallOpt))
3021
+ if (canGuaranteeTCO(CalleeCC,
3022
+ getTargetMachine().Options.GuaranteedTailCallOpt)) {
3023
+ LLVM_DEBUG(dbgs() << (CalleeCC == CallerCC ? "true" : "false")
3024
+ << " (guaranteed tail-call CC)\n");
3062
3025
return CalleeCC == CallerCC;
3026
+ }
3063
3027
3064
- // Also avoid sibcall optimization if either caller or callee uses struct
3065
- // return semantics.
3028
+ // Also avoid sibcall optimization if only one of caller or callee uses
3029
+ // struct return semantics.
3066
3030
bool isCalleeStructRet = Outs.empty() ? false : Outs[0].Flags.isSRet();
3067
3031
bool isCallerStructRet = MF.getFunction().hasStructRetAttr();
3068
- if (isCalleeStructRet || isCallerStructRet)
3032
+ if (isCalleeStructRet != isCallerStructRet) {
3033
+ LLVM_DEBUG(dbgs() << "false (struct-ret)\n");
3069
3034
return false;
3035
+ }
3070
3036
3071
3037
// Externally-defined functions with weak linkage should not be
3072
3038
// tail-called on ARM when the OS does not support dynamic
@@ -3079,8 +3045,11 @@ bool ARMTargetLowering::IsEligibleForTailCallOptimization(
3079
3045
const GlobalValue *GV = G->getGlobal();
3080
3046
const Triple &TT = getTargetMachine().getTargetTriple();
3081
3047
if (GV->hasExternalWeakLinkage() &&
3082
- (!TT.isOSWindows() || TT.isOSBinFormatELF() || TT.isOSBinFormatMachO()))
3048
+ (!TT.isOSWindows() || TT.isOSBinFormatELF() ||
3049
+ TT.isOSBinFormatMachO())) {
3050
+ LLVM_DEBUG(dbgs() << "false (external weak linkage)\n");
3083
3051
return false;
3052
+ }
3084
3053
}
3085
3054
3086
3055
// Check that the call results are passed in the same way.
@@ -3089,70 +3058,44 @@ bool ARMTargetLowering::IsEligibleForTailCallOptimization(
3089
3058
getEffectiveCallingConv(CalleeCC, isVarArg),
3090
3059
getEffectiveCallingConv(CallerCC, CallerF.isVarArg()), MF, C, Ins,
3091
3060
CCAssignFnForReturn(CalleeCC, isVarArg),
3092
- CCAssignFnForReturn(CallerCC, CallerF.isVarArg())))
3061
+ CCAssignFnForReturn(CallerCC, CallerF.isVarArg()))) {
3062
+ LLVM_DEBUG(dbgs() << "false (incompatible results)\n");
3093
3063
return false;
3064
+ }
3094
3065
// The callee has to preserve all registers the caller needs to preserve.
3095
3066
const ARMBaseRegisterInfo *TRI = Subtarget->getRegisterInfo();
3096
3067
const uint32_t *CallerPreserved = TRI->getCallPreservedMask(MF, CallerCC);
3097
3068
if (CalleeCC != CallerCC) {
3098
3069
const uint32_t *CalleePreserved = TRI->getCallPreservedMask(MF, CalleeCC);
3099
- if (!TRI->regmaskSubsetEqual(CallerPreserved, CalleePreserved))
3070
+ if (!TRI->regmaskSubsetEqual(CallerPreserved, CalleePreserved)) {
3071
+ LLVM_DEBUG(dbgs() << "false (not all registers preserved)\n");
3100
3072
return false;
3073
+ }
3101
3074
}
3102
3075
3103
- // If Caller's vararg or byval argument has been split between registers and
3076
+ // If Caller's vararg argument has been split between registers and
3104
3077
// stack, do not perform tail call, since part of the argument is in caller's
3105
3078
// local frame.
3106
3079
const ARMFunctionInfo *AFI_Caller = MF.getInfo<ARMFunctionInfo>();
3107
- if (AFI_Caller->getArgRegsSaveSize())
3080
+ if (CLI.IsVarArg && AFI_Caller->getArgRegsSaveSize()) {
3081
+ LLVM_DEBUG(dbgs() << "false (vararg arg reg save area)\n");
3108
3082
return false;
3083
+ }
3109
3084
3110
3085
// If the callee takes no arguments then go on to check the results of the
3111
3086
// call.
3112
- if (!Outs.empty()) {
3113
- if (CCInfo.getStackSize()) {
3114
- // Check if the arguments are already laid out in the right way as
3115
- // the caller's fixed stack objects.
3116
- MachineFrameInfo &MFI = MF.getFrameInfo();
3117
- const MachineRegisterInfo *MRI = &MF.getRegInfo();
3118
- const TargetInstrInfo *TII = Subtarget->getInstrInfo();
3119
- for (unsigned i = 0, realArgIdx = 0, e = ArgLocs.size();
3120
- i != e;
3121
- ++i, ++realArgIdx) {
3122
- CCValAssign &VA = ArgLocs[i];
3123
- EVT RegVT = VA.getLocVT();
3124
- SDValue Arg = OutVals[realArgIdx];
3125
- ISD::ArgFlagsTy Flags = Outs[realArgIdx].Flags;
3126
- if (VA.getLocInfo() == CCValAssign::Indirect)
3127
- return false;
3128
- if (VA.needsCustom() && (RegVT == MVT::f64 || RegVT == MVT::v2f64)) {
3129
- // f64 and vector types are split into multiple registers or
3130
- // register/stack-slot combinations. The types will not match
3131
- // the registers; give up on memory f64 refs until we figure
3132
- // out what to do about this.
3133
- if (!VA.isRegLoc())
3134
- return false;
3135
- if (!ArgLocs[++i].isRegLoc())
3136
- return false;
3137
- if (RegVT == MVT::v2f64) {
3138
- if (!ArgLocs[++i].isRegLoc())
3139
- return false;
3140
- if (!ArgLocs[++i].isRegLoc())
3141
- return false;
3142
- }
3143
- } else if (!VA.isRegLoc()) {
3144
- if (!MatchingStackOffset(Arg, VA.getLocMemOffset(), Flags,
3145
- MFI, MRI, TII))
3146
- return false;
3147
- }
3148
- }
3149
- }
3150
-
3151
- const MachineRegisterInfo &MRI = MF.getRegInfo();
3152
- if (!parametersInCSRMatch(MRI, CallerPreserved, ArgLocs, OutVals))
3153
- return false;
3087
+ const MachineRegisterInfo &MRI = MF.getRegInfo();
3088
+ if (!parametersInCSRMatch(MRI, CallerPreserved, ArgLocs, OutVals)) {
3089
+ LLVM_DEBUG(dbgs() << "false (parameters in CSRs do not match)\n");
3090
+ return false;
3154
3091
}
3155
3092
3093
+ // If the stack arguments for this call do not fit into our own save area then
3094
+ // the call cannot be made tail.
3095
+ if (CCInfo.getStackSize() > AFI_Caller->getArgumentStackSize())
3096
+ return false;
3097
+
3098
+ LLVM_DEBUG(dbgs() << "true\n");
3156
3099
return true;
3157
3100
}
3158
3101
0 commit comments