@@ -2312,8 +2312,8 @@ bool SIInstrInfo::expandPostRAPseudo(MachineInstr &MI) const {
2312
2312
// present an issue.
2313
2313
// Fallback to V_MOV base lowering in all but the common cases.
2314
2314
const bool VMov64 = VMovOpc != AMDGPU::V_MOV_B32_e32;
2315
- const MachineFunction *MF = MBB.getParent ();
2316
- const MachineRegisterInfo &MRI = MF->getRegInfo ();
2315
+ MachineFunction *MF = MBB.getParent ();
2316
+ MachineRegisterInfo &MRI = MF->getRegInfo ();
2317
2317
const unsigned Opcode = AMDGPU::V_CNDMASK_B32_e64;
2318
2318
const MCInstrDesc &Desc = get (Opcode);
2319
2319
@@ -2359,30 +2359,18 @@ bool SIInstrInfo::expandPostRAPseudo(MachineInstr &MI) const {
2359
2359
2360
2360
if (UseVCndMask && VMov64) {
2361
2361
// Dual V_CNDMASK_B32
2362
- MachineOperand ActiveLo =
2363
- ActiveSrc.isReg ()
2364
- ? MachineOperand::CreateReg (
2365
- RI.getSubReg (ActiveSrc.getReg (), AMDGPU::sub0), false ,
2366
- /* isImp=*/ false , /* isKill=*/ false )
2367
- : MachineOperand::CreateImm (ActiveImmLo.getSExtValue ());
2368
- MachineOperand ActiveHi =
2369
- ActiveSrc.isReg ()
2370
- ? MachineOperand::CreateReg (
2371
- RI.getSubReg (ActiveSrc.getReg (), AMDGPU::sub1), false ,
2372
- /* isImp=*/ false , /* isKill=*/ ActiveSrc.isKill ())
2373
- : MachineOperand::CreateImm (ActiveImmHi.getSExtValue ());
2374
- MachineOperand InactiveLo =
2375
- InactiveSrc.isReg ()
2376
- ? MachineOperand::CreateReg (
2377
- RI.getSubReg (InactiveSrc.getReg (), AMDGPU::sub0), false ,
2378
- /* isImp=*/ false , /* isKill=*/ false )
2379
- : MachineOperand::CreateImm (InactiveImmLo.getSExtValue ());
2380
- MachineOperand InactiveHi =
2381
- InactiveSrc.isReg ()
2382
- ? MachineOperand::CreateReg (
2383
- RI.getSubReg (InactiveSrc.getReg (), AMDGPU::sub1), false ,
2384
- /* isImp=*/ false , /* isKill=*/ InactiveSrc.isKill ())
2385
- : MachineOperand::CreateImm (InactiveImmHi.getSExtValue ());
2362
+ MachineOperand ActiveLo = buildExtractSubRegOrImm (
2363
+ MI, MRI, ActiveSrc, nullptr , AMDGPU::sub0, nullptr );
2364
+ MachineOperand ActiveHi = buildExtractSubRegOrImm (
2365
+ MI, MRI, ActiveSrc, nullptr , AMDGPU::sub1, nullptr );
2366
+ MachineOperand InactiveLo = buildExtractSubRegOrImm (
2367
+ MI, MRI, InactiveSrc, nullptr , AMDGPU::sub0, nullptr );
2368
+ MachineOperand InactiveHi = buildExtractSubRegOrImm (
2369
+ MI, MRI, InactiveSrc, nullptr , AMDGPU::sub1, nullptr );
2370
+ if (ActiveSrc.isReg ())
2371
+ ActiveHi.setIsKill (ActiveSrc.isKill ());
2372
+ if (InactiveSrc.isReg ())
2373
+ InactiveHi.setIsKill (InactiveSrc.isKill ());
2386
2374
BuildMI (MBB, MI, DL, Desc, RI.getSubReg (DstReg, AMDGPU::sub0))
2387
2375
.addImm (0 )
2388
2376
.add (InactiveLo)
@@ -5783,6 +5771,9 @@ unsigned SIInstrInfo::buildExtractSubReg(
5783
5771
MachineBasicBlock::iterator MI, MachineRegisterInfo &MRI,
5784
5772
const MachineOperand &SuperReg, const TargetRegisterClass *SuperRC,
5785
5773
unsigned SubIdx, const TargetRegisterClass *SubRC) const {
5774
+ if (!SuperReg.getReg ().isVirtual ())
5775
+ return RI.getSubReg (SuperReg.getReg (), SubIdx);
5776
+
5786
5777
MachineBasicBlock *MBB = MI->getParent ();
5787
5778
DebugLoc DL = MI->getDebugLoc ();
5788
5779
Register SubReg = MRI.createVirtualRegister (SubRC);
0 commit comments