<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/148669>148669</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [AArch64] Expected a ZPR4StridedOrContiguous register, but got a ZPR4 register
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:AArch64
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          sjoerdmeijer
      </td>
    </tr>
</table>

<pre>
    For a build with expensive checks enabled, and this input:

```
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32"
target triple = "aarch64-unknown-linux-gnu"

define void @_Z4testytsybsxtyiyxttytiPtS_PA24_sPyS2_PxS2_PA23_tS2_PsPA23_aPiPaPA23_sPA23_SB_PA23_yPA23_S4_S2_SA_SA_PA23_SF_SG_SI_PA23_S7_(ptr %arr_5, ptr %arr_16, <vscale x 2 x i64> %0, <vscale x 2 x i1> %1, <vscale x 2 x i64> %vec.ind.next, <vscale x 2 x i16> %2, <vscale x 2 x i16> %3, <vscale x 2 x i16> %4, <vscale x 2 x i64> %5, <vscale x 2 x i64> %vec.ind, <vscale x 2 x i64> %step.add, <vscale x 2 x i64> %6, <vscale x 2 x i64> %step.add.2, ptr %7, i1 %8, <vscale x 2 x i1> %9) #0 {
entry:
  br label %vector.body1501

vector.body1501:                                  ; preds = %vector.body1501, %entry
  %vec.ind2 = phi <vscale x 2 x i64> [ zeroinitializer, %entry ], [ %vec.ind.next, %vector.body1501 ]
 %vec.phi1503 = phi <vscale x 2 x i16> [ zeroinitializer, %entry ], [ %2, %vector.body1501 ]
  %vec.phi1504 = phi <vscale x 2 x i16> [ zeroinitializer, %entry ], [ %3, %vector.body1501 ]
  %vec.phi1505 = phi <vscale x 2 x i16> [ zeroinitializer, %entry ], [ %4, %vector.body1501 ]
 %vec.phi1508 = phi <vscale x 2 x i64> [ zeroinitializer, %entry ], [ %34, %vector.body1501 ]
  %vec.phi1509 = phi <vscale x 2 x i64> [ zeroinitializer, %entry ], [ %35, %vector.body1501 ]
  %10 = or <vscale x 2 x i64> %vec.ind2, %step.add.2
  tail call void @llvm.masked.scatter.nxv2i64.nxv2p0(<vscale x 2 x i64> zeroinitializer, <vscale x 2 x ptr> zeroinitializer, i32 0, <vscale x 2 x i1> %1)
  %11 = extractelement <vscale x 2 x i64> %10, i64 0
  %12 = getelementptr i64, ptr %arr_5, i64 %11
  %wide.vec1526 = load <vscale x 8 x i64>, ptr %12, align 8
  %strided.vec1527 = tail call { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> } @llvm.vector.deinterleave4.nxv8i64(<vscale x 8 x i64> %wide.vec1526)
  %13 = extractvalue { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> } %strided.vec1527, 0
  %wide.vec1528 = load <vscale x 8 x i64>, ptr %7, align 8
  %strided.vec1529 = tail call { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> } @llvm.vector.deinterleave4.nxv8i64(<vscale x 8 x i64> %wide.vec1528)
  %14 = extractvalue { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> } %strided.vec1529, 0
  %wide.vec1530 = load <vscale x 8 x i64>, ptr %arr_16, align 8
  %strided.vec1531 = tail call { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> } @llvm.vector.deinterleave4.nxv8i64(<vscale x 8 x i64> %wide.vec1530)
  %15 = extractvalue { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> } %strided.vec1531, 0
  %wide.vec1532 = load <vscale x 8 x i64>, ptr %arr_5, align 8
  %strided.vec1533 = tail call { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> } @llvm.vector.deinterleave4.nxv8i64(<vscale x 8 x i64> %wide.vec1532)
  %16 = extractvalue { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> } %strided.vec1533, 0
  %17 = icmp eq <vscale x 2 x i64> %13, zeroinitializer
  %18 = icmp eq <vscale x 2 x i64> %14, zeroinitializer
  %19 = icmp eq <vscale x 2 x i64> %15, zeroinitializer
 %20 = icmp eq <vscale x 2 x i64> %16, zeroinitializer
  %21 = and <vscale x 2 x i1> %1, %17
  %22 = and <vscale x 2 x i1> %1, %18
  %23 = and <vscale x 2 x i1> %1, %19
  %24 = and <vscale x 2 x i1> %1, %20
  %25 = zext <vscale x 2 x i1> %21 to <vscale x 2 x i16>
  %26 = zext <vscale x 2 x i1> %22 to <vscale x 2 x i16>
  %27 = zext <vscale x 2 x i1> %23 to <vscale x 2 x i16>
  %28 = zext <vscale x 2 x i1> %24 to <vscale x 2 x i16>
  %29 = xor <vscale x 2 x i16> %vec.phi1503, %25
  %30 = xor <vscale x 2 x i16> %vec.phi1504, %26
  %31 = xor <vscale x 2 x i16> %vec.phi1505, %27
 %wide.vec1540 = load <vscale x 8 x i64>, ptr null, align 8
 %strided.vec1541 = tail call { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> } @llvm.vector.deinterleave4.nxv8i64(<vscale x 8 x i64> %wide.vec1540)
  %32 = extractvalue { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> } %strided.vec1541, 0
  %33 = tail call <vscale x 2 x i64> @llvm.umin.nxv2i64(<vscale x 2 x i64> %32, <vscale x 2 x i64> %6)
  %34 = xor <vscale x 2 x i64> %vec.phi1508, %33
  %35 = xor <vscale x 2 x i64> %vec.phi1509, %0
  br i1 %8, label %middle.block1547, label %vector.body1501

middle.block1547:                                 ; preds = %vector.body1501
  %bin.rdx1548 = xor <vscale x 2 x i16> %30, %29
 %bin.rdx1549 = xor <vscale x 2 x i16> %31, %bin.rdx1548
  %bin.rdx1550 = xor <vscale x 2 x i16> %28, %bin.rdx1549
  %36 = tail call i16 @llvm.vector.reduce.xor.nxv2i16(<vscale x 2 x i16> %bin.rdx1550)
 %bin.rdx1552 = xor <vscale x 2 x i64> %vec.phi1509, %vec.phi1508
  store i16 %36, ptr %arr_5, align 2
  ret void

; uselistorder directives
 uselistorder <vscale x 2 x i1> %1, { 1, 2, 3, 4, 0 }
}

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare <vscale x 2 x i64> @llvm.umin.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>) #1

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(write)
declare void @llvm.masked.scatter.nxv2i64.nxv2p0(<vscale x 2 x i64>, <vscale x 2 x ptr>, i32 immarg, <vscale x 2 x i1>) #2

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(none)
declare { <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64> } @llvm.vector.deinterleave4.nxv8i64(<vscale x 8 x i64>) #3

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i16 @llvm.vector.reduce.xor.nxv2i16(<vscale x 2 x i16>) #1

; uselistorder directives
uselistorder ptr @llvm.vector.deinterleave4.nxv8i64, { 4, 3, 2, 1, 0 }

attributes #0 = { "target-cpu"="grace" }
attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #2 = { nocallback nofree nosync nounwind willreturn memory(write) }
attributes #3 = { nocallback nofree nosync nounwind willreturn memory(none) }

```

We are running into this error:

```
*** Bad machine code: Illegal virtual register for instruction ***
- function: _Z4testytsybsxtyiyxttytiPtS_PA24_sPyS2_PxS2_PA23_tS2_PsPA23_aPiPaPA23_sPA23_SB_PA23_yPA23_S4_S2_SA_SA_PA23_SF_SG_SI_PA23_S7_
- basic block: %bb.1 vector.body1501 (0xaaaaaf6ccc00) [512B;1024B)
- instruction: 712B     STR_ZZZZXI %72:zpr4, %stack.0, 0 :: (store (s512) into %stack.0, align 16)
- operand 0:   %72:zpr4
Expected a ZPR4StridedOrContiguous register, but got a ZPR4 register

*** Bad machine code: Illegal virtual register for instruction ***
- function: _Z4testytsybsxtyiyxttytiPtS_PA24_sPyS2_PxS2_PA23_tS2_PsPA23_aPiPaPA23_sPA23_SB_PA23_yPA23_S4_S2_SA_SA_PA23_SF_SG_SI_PA23_S7_
- basic block: %bb.2 middle.block1547 (0xaaaaaf6ccfd0) [1024B;1392B)
- instruction: 1032B    %73:zpr4 = LDR_ZZZZXI %stack.0, 0 :: (load (s512) from %stack.0, align 16)
- operand 0:   %73:zpr4
Expected a ZPR4StridedOrContiguous register, but got a ZPR4 register
LLVM ERROR: Found 2 machine code errors.
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzkWm2P4r4R_zTmjQXyQxLCC16E26M66ar_aqnaat8gkwzg2-BQx2HhPn1l54HwDP_bXq_XFcrG2POb8cx4xh4j8lwuFMAQ-SPkP3VEYZaZHubfMtDJCuQ30J1ZluyG40xjgWeFTBP8Ls0Sw3YNKpcbwPES4rccgxKzFBLEPmGhEmyWMsdSrQuDeISI-wSk-pDICL0AgxNhRCp2WWEw4k8YMQbdFeIRdNesTxCPOHMP26SHTfsWeO7RlSHiUVh2SRogHrmHbTVDKLMDKAu7ipe03YltjW2Tsb1MRst1CrU8Quh4GXjdQr2p7F11U6mKbXehipIGkSiBuVSAN5lMMPLI9NUzkJudyXezfGt2crc1Zmfks5lMnyPmTfPn3YRNn7f2ETE-NfYld6_iWT4L91a2J6NyyK5sedMJm04i-ym_GE8nf5lOvlSt_hSxcG00RswXWk99a4tWmwb2C8Q_bfJYpIC3mOEtdhr6bMeQs9206qXXiTcQ96RKegq25jxOUI1k17v59W7vuhj-XVJeH5QbWPdEcmPUDWXWID3WskLfvktqX8Oryh4gNsCIcYJRf4RIBMroXbmQMJ5pnIoZpNWETKZ7do1Sn9DSI4-_5BG--Yf4CK81JHnl-CfIVlzml4JYKfbaZI5kvZQX1eGP8HfQmVTSSJHK76DbcBj5T67tj8560oksjoBE9eD1UlKf8MtSVM7zkBTsOutD3t7H8uaP8PY_lrf3gMrDjzU8v8H7kPngg5n7t5lT4nhm-naEqd2nFQYsiBEyxbFI0yZdpOlm1VuJ_A2SXh4LY0D31HbDZOC5_2uCbOI6y-7c7I5Gro2-MFJyhm9G_EEzdeqmDlujRWwghRUoc0UN1EHLwMOkgSjjxAJqchsULcVhlvJrQse1Jn6XCfQ2EFOfBQ4mzURywD9s-LcAqbODSOVC4bDGyo2WCSQVXN_B7Q2D-qML87oc8P9MD0b9p8YBKqdLQCoDOgWxAWf-0OknPD_PY720zcXb5tqItICfPLETNVsCcsac4QPm7N-05uB3sWbYtqb3q1lzcMGanDxgzf2e9JpJOf1NTMpJ26T-L2ZSTi-ZlD1oUv-mRfnvYlHWtmjwq1mUH1iUlolOxqs1hn9dS92O7njHUKOE96J411AG96L4F1DsDp3cCxJcEYWV4UWo5NbR16qwoWIPUDWrgPEHqBrHYt79VKwxNysDzHfYntmm1WSMYpNdODc0QME9QOwOoP49QPwOoPAeIO8OoNINt-c29E3BoXXCrJXs1wBVursXoD7fsKABoA8B1GcU1q_WwD4WeXdnXlWk6VGIPg4d3u-Sc712zq0y2a8Tob3DnHuaFy9AVfopVlLVZ8XLh0Q38ZulrL2SvMseeXDIrUoAlUdy3gD4DwEMKgBSl7Za5bGmyrWSSZJCb5Zm8Rv1vf5B59kS2AnFHTWwmyWwaoYzqXo62VLfC-9YvZzUi3ZQLbU9_T3xh9exvcX2RBL_nkDEwhOkvdmDI9-Tdj9zuBA1JEUMvW1WVShsXj31uoZdSzh0Onef_Sk3aXueFT03mYZSWDuJy1vRsv6iwbjKS3UhwUe4yCGVFiUBjROpITZyA7kdfdB1I_X2R9i9uJXmEoUL9sSue8upfJYsx4WKjcwUjozRufVMlVmdz0T8hlU21wBYZflOxVhlhXqXKsH5GuIiFUbMUsDvMk01mEIrvIJVpneIhSpTUKo5gTgVGj4kelwLda5ATX9sWudm8q6lOZrKBxTLLhfH6mKYXK2EXlysiFUTZh8_4TOm-59Jt5VW-E_37h-LT6feezkOHPS44HKXwsqg4DXxwEUGehAUSCSM0XJWGMir2x6beKzxGStvI7vx2t008ifE2EKLGJA9ezj6Q2LaEH-cvs8yYg8wura-z4LzHwQ_FPzo0hmR6B-ArffoQimpFlgqk5VX1aB1ps9eVSNWffBIJHgl4qVUgOMsAevcX9IUFiLFG6lNIVKsYSFzAxrPM42lyo0uyuXQwCASdfG8WiUW4r96Y2yFmYlcxtjtlaw8Nk3PehSf3ISwkGyF_ZsHcRwT4hTtj3zKRoiPKGHeqFyk3fbMLWSfspHbY03-9jJ9fX19_ecXV89liEff19prbktE_NYj1SLhUSlNWCZ5--IK-oPSbIfjyyxPg1qAbA3aHplJufM7YEaiz9s1xAYSLPDr84s3KXflf-hPmTJyUWRF3hjSgs8KgxeZqUbvu0pf-f_0D4aP99hHDjJPagcpPYOPKB-wSx5CCS9dxFqKV5ZyweDrU9tlLrhIee7de8hcZ6vHPYT_Bzzk69e__xV_fnn548XyGWeFSjA7cJMy9uS9dtzpJEOeDPhAdGBI-z7zKaODoLMcilkS07kXe-DDHIjPB8k8pGEQg9cPSex35JAR5pM-9WjgBzzocZYI4nl9jyYDwgJAHoGVkGnPJbFMLzoyzwsYUi8MgkHHnaty94Mgxmz4BZUgHkWR-x2MzUX-U0cPLXF3Vixymw1lbvI9nJEmdb8oqmn8J_wx6uwUOh0ujVnbfQViY8TGC2mWxawXZyvExlaE6l93rbNvEBvExm56OWLjaoabIft3AAAA__-qt7Wn">