@@ -126,6 +126,7 @@ class AMDGPURegBankLegalizeCombiner {
126126 bool tryEliminateReadAnyLane (MachineInstr &Copy);
127127 void tryCombineCopy (MachineInstr &MI);
128128 void tryCombineS1AnyExt (MachineInstr &MI);
129+ void tryCombineTrunc (MachineInstr &MI);
129130};
130131
131132bool AMDGPURegBankLegalizeCombiner::isLaneMask (Register Reg) {
@@ -345,6 +346,25 @@ void AMDGPURegBankLegalizeCombiner::tryCombineS1AnyExt(MachineInstr &MI) {
345346 llvm_unreachable (" missing anyext + trunc combine" );
346347}
347348
349+ void AMDGPURegBankLegalizeCombiner::tryCombineTrunc (MachineInstr &MI) {
350+ if (MI.getOpcode () != AMDGPU::G_TRUNC)
351+ return ;
352+
353+ Register Dst = MI.getOperand (0 ).getReg ();
354+ Register Src = MI.getOperand (1 ).getReg ();
355+ auto *SrcDefMI = MRI.getVRegDef (Src);
356+ if (MRI.getType (Dst) != LLT::scalar (1 ) || !MRI.use_empty (Dst))
357+ return ;
358+
359+ if (SrcDefMI && (SrcDefMI->getOpcode () == AMDGPU::G_UADDO ||
360+ SrcDefMI->getOpcode () == AMDGPU::G_USUBO ||
361+ SrcDefMI->getOpcode () == AMDGPU::G_UADDE ||
362+ SrcDefMI->getOpcode () == AMDGPU::G_USUBE)) {
363+ MI.eraseFromParent ();
364+ return ;
365+ }
366+ }
367+
348368// Search through MRI for virtual registers with sgpr register bank and S1 LLT.
349369[[maybe_unused]] static Register getAnySgprS1 (const MachineRegisterInfo &MRI) {
350370 const LLT S1 = LLT::scalar (1 );
@@ -475,6 +495,10 @@ bool AMDGPURegBankLegalize::runOnMachineFunction(MachineFunction &MF) {
475495 Combiner.tryCombineCopy (MI);
476496 continue ;
477497 }
498+ if (MI.getOpcode () == AMDGPU::G_TRUNC) {
499+ Combiner.tryCombineTrunc (MI);
500+ continue ;
501+ }
478502 if (MI.getOpcode () == AMDGPU::G_ANYEXT) {
479503 Combiner.tryCombineS1AnyExt (MI);
480504 continue ;
0 commit comments