@@ -2118,7 +2118,8 @@ unsigned G4_Kernel::getSRFInWords() {
21182118
21192119// GRF modes supported by HW
21202120// There must be at least one Config that is VRTEnable for each platform
2121- GRFMode::GRFMode (const TARGET_PLATFORM platform, Options *op) : options(op) {
2121+ GRFMode::GRFMode (const TARGET_PLATFORM plat, Options *op)
2122+ : platform(plat), options(op) {
21222123 switch (platform) {
21232124 case Xe_XeHPSDV:
21242125 case Xe_DG2:
@@ -2179,7 +2180,7 @@ GRFMode::GRFMode(const TARGET_PLATFORM platform, Options *op) : options(op) {
21792180unsigned GRFMode::setModeByRegPressure (unsigned maxRP, unsigned largestInputReg,
21802181 bool forceGRFModeUp) {
21812182 unsigned size = configs.size (), i = 0 ;
2182- bool spillAllowed = options-> getuInt32Option (vISA_SpillAllowed ) > 256 ;
2183+ bool spillAllowed = getSpillThreshold ( ) > 0 ;
21832184 // find appropiate GRF based on reg pressure
21842185 for (; i < size; i++) {
21852186 if (configs[i].VRTEnable && configs[i].numGRF >= lowerBoundGRF &&
@@ -2197,10 +2198,22 @@ unsigned GRFMode::setModeByRegPressure(unsigned maxRP, unsigned largestInputReg,
21972198 currentMode = newGRFMode < maxGRFMode ? newGRFMode : maxGRFMode;
21982199 }
21992200
2200- if (spillAllowed && currentMode > 0 )
2201- return configs[--currentMode].numGRF ;
2202- else
2203- return configs[currentMode].numGRF ;
2201+ if (spillAllowed && currentMode > 0 ) {
2202+ unsigned lowerGRFNum = configs[currentMode - 1 ].numGRF ;
2203+ // Select a lower GRF number in PreRA in case the register
2204+ // pressure computed is a bit higher (e.g. 5%) than the lower GRF
2205+ // config. If spills are detected, RA will still bump up the GRF
2206+ // number to avoid them.
2207+ // For example, if reg pressure is 167, we select 160GRF since
2208+ // we have spill threshold enabled and the diff between 167 and 160
2209+ // is less than 5%.
2210+ if ((lowerGRFNum * 1.05 >= maxRP ||
2211+ configs[currentMode].numGRF == getMaxGRF ()) &&
2212+ lowerGRFNum >= (largestInputReg + 8 ) &&
2213+ lowerGRFNum >= lowerBoundGRF)
2214+ return configs[--currentMode].numGRF ;
2215+ }
2216+ return configs[currentMode].numGRF ;
22042217 }
22052218 }
22062219 }
@@ -2220,6 +2233,8 @@ bool GRFMode::hasLargerGRFSameThreads() const {
22202233
22212234// Get spill threshold for current GRF mode
22222235unsigned GRFMode::getSpillThreshold () const {
2236+ if (platform < Xe3)
2237+ return 0 ;
22232238 if (configs[currentMode].numGRF == 256 &&
22242239 options->getuInt32Option (vISA_SpillAllowed256GRF) > 0 )
22252240 return options->getuInt32Option (vISA_SpillAllowed256GRF);
0 commit comments