@@ -476,17 +476,21 @@ void RegBankLegalizeHelper::lowerUnpackMinMax(MachineInstr &MI) {
476476 // For signed operations, use sign extension
477477 auto [Val0_Lo, Val0_Hi] = unpackSExt (MI.getOperand (1 ).getReg ());
478478 auto [Val1_Lo, Val1_Hi] = unpackSExt (MI.getOperand (2 ).getReg ());
479- Lo = B.buildInstr (MI.getOpcode (), {SgprRB_S32}, {Val0_Lo, Val1_Lo}).getReg (0 );
480- Hi = B.buildInstr (MI.getOpcode (), {SgprRB_S32}, {Val0_Hi, Val1_Hi}).getReg (0 );
479+ Lo = B.buildInstr (MI.getOpcode (), {SgprRB_S32}, {Val0_Lo, Val1_Lo})
480+ .getReg (0 );
481+ Hi = B.buildInstr (MI.getOpcode (), {SgprRB_S32}, {Val0_Hi, Val1_Hi})
482+ .getReg (0 );
481483 break ;
482484 }
483485 case AMDGPU::G_UMIN:
484486 case AMDGPU::G_UMAX: {
485487 // For unsigned operations, use zero extension
486488 auto [Val0_Lo, Val0_Hi] = unpackZExt (MI.getOperand (1 ).getReg ());
487489 auto [Val1_Lo, Val1_Hi] = unpackZExt (MI.getOperand (2 ).getReg ());
488- Lo = B.buildInstr (MI.getOpcode (), {SgprRB_S32}, {Val0_Lo, Val1_Lo}).getReg (0 );
489- Hi = B.buildInstr (MI.getOpcode (), {SgprRB_S32}, {Val0_Hi, Val1_Hi}).getReg (0 );
490+ Lo = B.buildInstr (MI.getOpcode (), {SgprRB_S32}, {Val0_Lo, Val1_Lo})
491+ .getReg (0 );
492+ Hi = B.buildInstr (MI.getOpcode (), {SgprRB_S32}, {Val0_Hi, Val1_Hi})
493+ .getReg (0 );
490494 break ;
491495 }
492496 default :
@@ -1359,7 +1363,13 @@ void RegBankLegalizeHelper::applyMappingTrivial(MachineInstr &MI) {
13591363 B.setInstr (MI);
13601364 for (unsigned i = NumDefs; i < NumOperands; ++i) {
13611365 Register Reg = MI.getOperand (i).getReg ();
1362- if (MRI.getRegBank (Reg) != RB) {
1366+ // Helper to check if a register should be skipped for VGPR conversion
1367+ auto shouldSkipVGPRConversion = [&](Register Reg) {
1368+ MachineInstr *DefMI = MRI.getVRegDef (Reg);
1369+ // Skip if defining instruction is implicit_def
1370+ return DefMI && DefMI->getOpcode () == TargetOpcode::G_IMPLICIT_DEF;
1371+ };
1372+ if (MRI.getRegBank (Reg) != RB && !shouldSkipVGPRConversion (Reg)) {
13631373 auto Copy = B.buildCopy ({VgprRB, MRI.getType (Reg)}, Reg);
13641374 MI.getOperand (i).setReg (Copy.getReg (0 ));
13651375 }
0 commit comments