@@ -498,6 +498,35 @@ RegRecord* LinearScan::getRegisterRecord(regNumber regNum)
498498    return &physRegs[regNum];
499499}
500500
501+ //------------------------------------------------------------------------
502+ // getAvailableGPRsForType: Returns available general-purpose registers for the given type,
503+ // with platform-specific restrictions applied.
504+ //
505+ // Arguments:
506+ //     candidates - The candidate register mask to be filtered
507+ //     regType    - The register type for which we need available registers
508+ //
509+ // Return Value:
510+ //     A filtered register mask with platform-specific restrictions applied.
511+ //     For AMD64: GC types and long types are restricted to low GPRs only.
512+ //     For other platforms: Returns the original candidates unchanged.
513+ //
514+ // Notes:
515+ //     On AMD64, we don't use extended GPRs (R16-R31) for GC types to ensure
516+ //     proper GC tracking and code generation compatibility.
517+ //
518+ SingleTypeRegSet LinearScan::getAvailableGPRsForType(SingleTypeRegSet candidates, var_types regType)
519+ {
520+ #ifdef TARGET_AMD64
521+     if ((varTypeIsGC(regType) || varTypeIsLong(regType)) && ((candidates & RBM_LOWINT.getLow()) != 0))
522+     {
523+         // For AMD64, we don't use eGPR for GC types.
524+         candidates &= (SingleTypeRegSet)RBM_LOWINT.getLow();
525+     }
526+ #endif // TARGET_AMD64
527+     return candidates;
528+ }
529+ 
501530#ifdef DEBUG
502531
503532//----------------------------------------------------------------------------
@@ -8694,6 +8723,7 @@ regNumber LinearScan::getTempRegForResolution(BasicBlock*      fromBlock,
86948723    }
86958724#else  // !TARGET_ARM
86968725    SingleTypeRegSet freeRegs = allRegs(type);
8726+     freeRegs = getAvailableGPRsForType(freeRegs, (type == TYP_INT) ? TYP_REF : type);
86978727#endif // !TARGET_ARM
86988728
86998729#ifdef DEBUG
@@ -13466,7 +13496,7 @@ SingleTypeRegSet LinearScan::RegisterSelection::select(Interval*
1346613496    {
1346713497        preferences = candidates;
1346813498    }
13469- 
13499+     candidates = linearScan->getAvailableGPRsForType(candidates, regType); 
1347013500#ifdef DEBUG
1347113501    candidates = linearScan->stressLimitRegs(refPosition, regType, candidates);
1347213502#endif
@@ -13934,7 +13964,7 @@ SingleTypeRegSet LinearScan::RegisterSelection::selectMinimal(
1393413964            }
1393513965        }
1393613966    }
13937- 
13967+     candidates = linearScan->getAvailableGPRsForType(candidates, regType); 
1393813968#ifdef DEBUG
1393913969    candidates = linearScan->stressLimitRegs(refPosition, regType, candidates);
1394013970#endif
0 commit comments