[llvm] BPF: Fix misfolding subregisters (PR #208244)

via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 9 07:31:10 PDT 2026


================
@@ -89,24 +90,26 @@ void BPFMIPeephole::initialize(MachineFunction &MFParm) {
   MF = &MFParm;
   MRI = &MF->getRegInfo();
   TII = MF->getSubtarget<BPFSubtarget>().getInstrInfo();
+  TRI = &TII->getRegisterInfo();
   LLVM_DEBUG(dbgs() << "*** BPF MachineSSA ZEXT Elim peephole pass ***\n\n");
 }
 
 bool BPFMIPeephole::isCopyFrom32Def(MachineInstr *CopyMI)
 {
   MachineOperand &opnd = CopyMI->getOperand(1);
 
-  if (!opnd.isReg())
-    return false;
-
   // Return false if getting value from a 32bit physical register.
   // Most likely, this physical register is aliased to
   // function call return value or current function parameters.
   Register Reg = opnd.getReg();
   if (!Reg.isVirtual())
     return false;
 
-  if (MRI->getRegClass(Reg) == &BPF::GPRRegClass)
+  const TargetRegisterClass *RC = MRI->getRegClass(Reg);
+  if (unsigned SubReg = opnd.getSubReg())
+    RC = TRI->getSubRegisterClass(RC, SubReg);
+
+  if (!RC->hasSubClassEq(&BPF::GPRRegClass))
----------------
yonghong-song wrote:

Why this change? Seems they are equivalent?

https://github.com/llvm/llvm-project/pull/208244


More information about the llvm-commits mailing list