[llvm] [X86][GISel] Fix crash on bitcasting i16 <-> half with gisel enabled. (PR #168456)

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Sat Nov 22 08:37:55 PST 2025


================
@@ -312,6 +312,55 @@ bool X86InstructionSelector::selectCopy(MachineInstr &I,
       }
     }
 
+    const int RegBankSize = 16;
+
+    // Special case GPR16 -> XMM
+    if (SrcSize == RegBankSize && SrcRegBank.getID() == X86::GPRRegBankID &&
+        (DstRegBank.getID() == X86::VECRRegBankID)) {
+
+      const DebugLoc &DL = I.getDebugLoc();
+
+      // Any extend GPR16 -> GPR32
+      Register ExtReg = MRI.createVirtualRegister(&X86::GR32RegClass);
+      BuildMI(*I.getParent(), I, DL, TII.get(TargetOpcode::SUBREG_TO_REG),
+              ExtReg)
+          .addImm(0)
+          .addReg(SrcReg)
+          .addImm(X86::sub_16bit);
+
+      // Copy GR32 -> XMM
+      BuildMI(*I.getParent(), I, DL, TII.get(TargetOpcode::COPY), DstReg)
+          .addReg(ExtReg);
+
+      I.eraseFromParent();
+    }
+
+    // Special case XMM -> GR16
+    if (DstSize == RegBankSize && DstRegBank.getID() == X86::GPRRegBankID &&
----------------
RKSimon wrote:

```suggestion
    if (DstSize == 16 && DstRegBank.getID() == X86::GPRRegBankID &&
```

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


More information about the llvm-commits mailing list