@@ -3014,9 +3014,21 @@ bool GCNHazardRecognizer::fixVALUMaskWriteHazard(MachineInstr *MI) {
3014
3014
3015
3015
// Return the numeric ID 0-63 of an 64b SGPR pair for a given SGPR.
3016
3016
// i.e. SGPR0 = SGPR0_SGPR1 = 0, SGPR3 = SGPR2_SGPR3 = 1, etc
3017
- static unsigned sgprPairNumber (Register Reg, const SIRegisterInfo &TRI) {
3017
+ static std::optional<unsigned > sgprPairNumber (Register Reg, const SIRegisterInfo &TRI) {
3018
+ switch (Reg) {
3019
+ case AMDGPU::M0:
3020
+ case AMDGPU::EXEC:
3021
+ case AMDGPU::EXEC_LO:
3022
+ case AMDGPU::EXEC_HI:
3023
+ case AMDGPU::SGPR_NULL:
3024
+ case AMDGPU::SGPR_NULL64:
3025
+ return {};
3026
+ default :
3027
+ break ;
3028
+ }
3018
3029
unsigned RegN = TRI.getEncodingValue (Reg);
3019
- assert (RegN <= 127 );
3030
+ if (RegN > 127 )
3031
+ return {};
3020
3032
return (RegN >> 1 ) & 0x3f ;
3021
3033
}
3022
3034
@@ -3049,7 +3061,6 @@ void GCNHazardRecognizer::computeVALUHazardSGPRs(MachineFunction *MMF) {
3049
3061
// before a SALU write to the same SGPR. This provides a reduction in
3050
3062
// hazard insertion when all VALU access to an SGPR occurs after its last
3051
3063
// SALU write, when compared to a linear scan.
3052
- const unsigned SGPR_NULL = TRI.getEncodingValue (AMDGPU::SGPR_NULL_gfx11plus);
3053
3064
const MachineRegisterInfo &MRI = MF.getRegInfo ();
3054
3065
BitVector SALUWriteSGPRs (64 ), ReadSGPRs (64 );
3055
3066
MachineCycleInfo CI;
@@ -3074,19 +3085,19 @@ void GCNHazardRecognizer::computeVALUHazardSGPRs(MachineFunction *MMF) {
3074
3085
continue ;
3075
3086
if (!TRI.isSGPRReg (MRI, Reg))
3076
3087
continue ;
3077
- if (TRI.getEncodingValue (Reg) >= SGPR_NULL)
3088
+ auto RegN = sgprPairNumber (Reg, TRI);
3089
+ if (!RegN)
3078
3090
continue ;
3079
- unsigned RegN = sgprPairNumber (Reg, TRI);
3080
3091
if (IsVALU && Op.isUse ()) {
3081
3092
// Note: any access within a cycle must be considered a hazard.
3082
- if (InCycle || (ReadSGPRs[RegN] && SALUWriteSGPRs[RegN]))
3083
- VALUReadHazardSGPRs.set (RegN);
3084
- ReadSGPRs.set (RegN);
3093
+ if (InCycle || (ReadSGPRs[* RegN] && SALUWriteSGPRs[* RegN]))
3094
+ VALUReadHazardSGPRs.set (* RegN);
3095
+ ReadSGPRs.set (* RegN);
3085
3096
} else if (IsSALU) {
3086
3097
if (Op.isDef ())
3087
- SALUWriteSGPRs.set (RegN);
3098
+ SALUWriteSGPRs.set (* RegN);
3088
3099
else
3089
- ReadSGPRs.set (RegN);
3100
+ ReadSGPRs.set (* RegN);
3090
3101
}
3091
3102
}
3092
3103
}
@@ -3155,7 +3166,6 @@ bool GCNHazardRecognizer::fixVALUReadSGPRHazard(MachineInstr *MI) {
3155
3166
MI->getOpcode () == AMDGPU::S_ENDPGM_SAVED);
3156
3167
3157
3168
// Collect all SGPR sources for MI which are read by a VALU.
3158
- const unsigned SGPR_NULL = TRI.getEncodingValue (AMDGPU::SGPR_NULL_gfx11plus);
3159
3169
const MachineRegisterInfo &MRI = MF.getRegInfo ();
3160
3170
SmallSet<Register, 4 > SGPRsUsed;
3161
3171
@@ -3171,12 +3181,11 @@ bool GCNHazardRecognizer::fixVALUReadSGPRHazard(MachineInstr *MI) {
3171
3181
if (!TRI.isSGPRReg (MRI, OpReg))
3172
3182
continue ;
3173
3183
3174
- // Ignore special purposes registers such as NULL, EXEC, and M0.
3175
- if (TRI. getEncodingValue (OpReg) >= SGPR_NULL )
3184
+ auto RegN = sgprPairNumber (OpReg, TRI);
3185
+ if (!RegN )
3176
3186
continue ;
3177
3187
3178
- unsigned RegN = sgprPairNumber (OpReg, TRI);
3179
- if (!VALUReadHazardSGPRs[RegN])
3188
+ if (!VALUReadHazardSGPRs[*RegN])
3180
3189
continue ;
3181
3190
3182
3191
SGPRsUsed.insert (OpReg);
@@ -3239,8 +3248,8 @@ bool GCNHazardRecognizer::fixVALUReadSGPRHazard(MachineInstr *MI) {
3239
3248
auto hazardPair = [this ](Register Reg) {
3240
3249
if (Reg == AMDGPU::VCC || Reg == AMDGPU::VCC_LO || Reg == AMDGPU::VCC_HI)
3241
3250
return Register (AMDGPU::VCC);
3242
- // TODO: handle TTMP?
3243
- return Register (AMDGPU::SGPR0_SGPR1 + sgprPairNumber (Reg, TRI) );
3251
+ auto RegN = sgprPairNumber (Reg, TRI);
3252
+ return Register (AMDGPU::SGPR0_SGPR1 + *RegN );
3244
3253
};
3245
3254
auto SearchHazardFn = [this , hazardPair,
3246
3255
&SGPRsUsed](const MachineInstr &I) {
0 commit comments