Author: Jonas Paulsson Date: 2026-02-02T09:07:15Z New Revision: 38b58a2ea1bca1a2b6f1b13fc055ebce860b0da0
URL: https://github.com/llvm/llvm-project/commit/38b58a2ea1bca1a2b6f1b13fc055ebce860b0da0 DIFF: https://github.com/llvm/llvm-project/commit/38b58a2ea1bca1a2b6f1b13fc055ebce860b0da0.diff LOG: [SystemZ] Bugfix: Add VLR16 to SystemZInstrInfo::copyPhysReg(). (#178932) Support COPYs involving higher FP16 regs (like F24H) with a new pseudo instruction 'VLR16'. This is needed with -O0/regalloc=fast, and probably in more cases as well. Fixes #178788. (cherry picked from commit 09f9a2892a412a73d42942e78eed9cde61c7a9e7) Added: llvm/test/CodeGen/SystemZ/copy-physreg-vr16.ll Modified: llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp llvm/lib/Target/SystemZ/SystemZInstrVector.td llvm/lib/Target/SystemZ/SystemZScheduleZ13.td llvm/lib/Target/SystemZ/SystemZScheduleZ14.td llvm/lib/Target/SystemZ/SystemZScheduleZ15.td llvm/lib/Target/SystemZ/SystemZScheduleZ16.td llvm/lib/Target/SystemZ/SystemZScheduleZ17.td Removed: ################################################################################ diff --git a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp index 33e48f8ff1511..fcde175b42643 100644 --- a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp +++ b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp @@ -541,6 +541,7 @@ void SystemZAsmPrinter::emitInstruction(const MachineInstr *MI) { .addReg(SystemZMC::getRegAsGR64(MI->getOperand(2).getReg())); break; + case SystemZ::VLR16: case SystemZ::VLR32: case SystemZ::VLR64: LoweredMI = MCInstBuilder(SystemZ::VLR) diff --git a/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp b/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp index 43d0446fda2f2..913c62f9f8449 100644 --- a/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp +++ b/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp @@ -999,6 +999,8 @@ void SystemZInstrInfo::copyPhysReg(MachineBasicBlock &MBB, Opcode = SystemZ::LDR; else if (SystemZ::FP128BitRegClass.contains(DestReg, SrcReg)) Opcode = SystemZ::LXR; + else if (SystemZ::VR16BitRegClass.contains(DestReg, SrcReg)) + Opcode = SystemZ::VLR16; else if (SystemZ::VR32BitRegClass.contains(DestReg, SrcReg)) Opcode = SystemZ::VLR32; else if (SystemZ::VR64BitRegClass.contains(DestReg, SrcReg)) diff --git a/llvm/lib/Target/SystemZ/SystemZInstrVector.td b/llvm/lib/Target/SystemZ/SystemZInstrVector.td index eb5753cfcde99..b0257be2eab89 100644 --- a/llvm/lib/Target/SystemZ/SystemZInstrVector.td +++ b/llvm/lib/Target/SystemZ/SystemZInstrVector.td @@ -14,6 +14,7 @@ let Predicates = [FeatureVector] in { // Register move. let isMoveReg = 1 in { def VLR : UnaryVRRa<"vlr", 0xE756, null_frag, v128any, v128any>; + def VLR16 : UnaryAliasVRR<null_frag, v16hb, v16hb>; def VLR32 : UnaryAliasVRR<null_frag, v32sb, v32sb>; def VLR64 : UnaryAliasVRR<null_frag, v64db, v64db>; } diff --git a/llvm/lib/Target/SystemZ/SystemZScheduleZ13.td b/llvm/lib/Target/SystemZ/SystemZScheduleZ13.td index 84c6ca21d7e93..afe8dec402548 100644 --- a/llvm/lib/Target/SystemZ/SystemZScheduleZ13.td +++ b/llvm/lib/Target/SystemZ/SystemZScheduleZ13.td @@ -1169,7 +1169,7 @@ def : InstRW<[WLat15, LSU, VecDF2, GroupAlone], (instregex "TD(C|G)XT$")>; // Vector: Move instructions //===----------------------------------------------------------------------===// -def : InstRW<[WLat1, FXb, NormalGr], (instregex "VLR(32|64)?$")>; +def : InstRW<[WLat1, FXb, NormalGr], (instregex "VLR(16|32|64)?$")>; def : InstRW<[WLat4, FXb, NormalGr], (instregex "VLGV(B|F|G|H)?$")>; def : InstRW<[WLat1, FXb, NormalGr], (instregex "VLVG(B|F|G|H)?$")>; def : InstRW<[WLat3, FXb, NormalGr], (instregex "VLVGP(32)?$")>; diff --git a/llvm/lib/Target/SystemZ/SystemZScheduleZ14.td b/llvm/lib/Target/SystemZ/SystemZScheduleZ14.td index b48ed08c8a189..dbbbcbee1c146 100644 --- a/llvm/lib/Target/SystemZ/SystemZScheduleZ14.td +++ b/llvm/lib/Target/SystemZ/SystemZScheduleZ14.td @@ -1187,7 +1187,7 @@ def : InstRW<[WLat15, LSU, VecDF2, GroupAlone], (instregex "TD(C|G)XT$")>; // Vector: Move instructions //===----------------------------------------------------------------------===// -def : InstRW<[WLat1, FXb, NormalGr], (instregex "VLR(32|64)?$")>; +def : InstRW<[WLat1, FXb, NormalGr], (instregex "VLR(16|32|64)?$")>; def : InstRW<[WLat3, FXb, NormalGr], (instregex "VLGV(B|F|G|H)?$")>; def : InstRW<[WLat1, FXb, NormalGr], (instregex "VLVG(B|F|G|H)?$")>; def : InstRW<[WLat3, FXb, NormalGr], (instregex "VLVGP(32)?$")>; diff --git a/llvm/lib/Target/SystemZ/SystemZScheduleZ15.td b/llvm/lib/Target/SystemZ/SystemZScheduleZ15.td index e3ec7a6994221..618e6dfa823d6 100644 --- a/llvm/lib/Target/SystemZ/SystemZScheduleZ15.td +++ b/llvm/lib/Target/SystemZ/SystemZScheduleZ15.td @@ -1209,7 +1209,7 @@ def : InstRW<[WLat15, LSU, VecDF2, GroupAlone], (instregex "TD(C|G)XT$")>; // Vector: Move instructions //===----------------------------------------------------------------------===// -def : InstRW<[WLat1, FXb, NormalGr], (instregex "VLR(32|64)?$")>; +def : InstRW<[WLat1, FXb, NormalGr], (instregex "VLR(16|32|64)?$")>; def : InstRW<[WLat3, FXb, NormalGr], (instregex "VLGV(B|F|G|H)?$")>; def : InstRW<[WLat1, FXb, NormalGr], (instregex "VLVG(B|F|G|H)?$")>; def : InstRW<[WLat3, FXb, NormalGr], (instregex "VLVGP(32)?$")>; diff --git a/llvm/lib/Target/SystemZ/SystemZScheduleZ16.td b/llvm/lib/Target/SystemZ/SystemZScheduleZ16.td index 4f904daec5052..0752b1c990091 100644 --- a/llvm/lib/Target/SystemZ/SystemZScheduleZ16.td +++ b/llvm/lib/Target/SystemZ/SystemZScheduleZ16.td @@ -1215,7 +1215,7 @@ def : InstRW<[WLat15, LSU, VecDF2, GroupAlone], (instregex "TD(C|G)XT$")>; // Vector: Move instructions //===----------------------------------------------------------------------===// -def : InstRW<[WLat1, FXb, NormalGr], (instregex "VLR(32|64)?$")>; +def : InstRW<[WLat1, FXb, NormalGr], (instregex "VLR(16|32|64)?$")>; def : InstRW<[WLat3, FXb, NormalGr], (instregex "VLGV(B|F|G|H)?$")>; def : InstRW<[WLat1, FXb, NormalGr], (instregex "VLVG(B|F|G|H)?$")>; def : InstRW<[WLat3, FXb, NormalGr], (instregex "VLVGP(32)?$")>; diff --git a/llvm/lib/Target/SystemZ/SystemZScheduleZ17.td b/llvm/lib/Target/SystemZ/SystemZScheduleZ17.td index 3b5ce6c9b5a0e..f8677d1191ccf 100644 --- a/llvm/lib/Target/SystemZ/SystemZScheduleZ17.td +++ b/llvm/lib/Target/SystemZ/SystemZScheduleZ17.td @@ -1230,7 +1230,7 @@ def : InstRW<[WLat15, LSU, VecDF2, GroupAlone], (instregex "TD(C|G)XT$")>; // Vector: Move instructions //===----------------------------------------------------------------------===// -def : InstRW<[WLat1, FXb, NormalGr], (instregex "VLR(32|64)?$")>; +def : InstRW<[WLat1, FXb, NormalGr], (instregex "VLR(16|32|64)?$")>; def : InstRW<[WLat3, FXb, NormalGr], (instregex "VLGV(B|F|G|H)?$")>; def : InstRW<[WLat1, FXb, NormalGr], (instregex "VLVG(B|F|G|H)?$")>; def : InstRW<[WLat3, FXb, NormalGr], (instregex "VLVGP(32)?$")>; diff --git a/llvm/test/CodeGen/SystemZ/copy-physreg-vr16.ll b/llvm/test/CodeGen/SystemZ/copy-physreg-vr16.ll new file mode 100644 index 0000000000000..89fb8e4e8f820 --- /dev/null +++ b/llvm/test/CodeGen/SystemZ/copy-physreg-vr16.ll @@ -0,0 +1,35 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 +; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z16 -regalloc=fast -verify-machineinstrs \ +; RUN: | FileCheck %s + +; Test COPY to $f0 from $f24. +define half @fun0(<4 x half> %0) { +; CHECK-LABEL: fun0: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: vlr %v0, %v24 +; CHECK-NEXT: br %r14 +entry: + %Res = extractelement <4 x half> %0, i32 0 + ret half %Res +} + +; Test COPY from $f0 to $f24. +define <4 x half> @fun1(half %0) { +; CHECK-LABEL: fun1: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: stmg %r14, %r15, 112(%r15) +; CHECK-NEXT: .cfi_offset %r14, -48 +; CHECK-NEXT: .cfi_offset %r15, -40 +; CHECK-NEXT: aghi %r15, -160 +; CHECK-NEXT: .cfi_def_cfa_offset 320 +; CHECK-NEXT: brasl %r14, __extendhfsf2@PLT +; CHECK-NEXT: aebr %f0, %f0 +; CHECK-NEXT: brasl %r14, __truncsfhf2@PLT +; CHECK-NEXT: vlr %v24, %v0 +; CHECK-NEXT: lmg %r14, %r15, 272(%r15) +; CHECK-NEXT: br %r14 +entry: + %Add = fadd half %0, %0 + %Res = insertelement <4 x half> poison, half %Add, i32 0 + ret <4 x half> %Res +} _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
