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

    <tr>
        <th>Summary</th>
        <td>
            [AArch64] Crash in aarch64 backend when compiling vsri/vcvtfxs2fp intrinsics in certain pattern
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

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

<pre>
    Using ARM Neon intrinsics in a certain pattern causes the compiler backend to crash on an invalid dag, and in debug mode causes an assertion earlier in the process

Reduced original C++ that triggered the issue when compiled with clang on armv8 and -O1:
(Godbolt link: https://godbolt.org/z/MEvPj1EWf )
```
#include <arm_neon.h>
float64_t do_stuff(const double* dVals) {
        float64x1_t var0 = vld1_f64((const float64_t*)&dVals[0]);
        float64x1_t var1 = vrndi_f64(var0);
        float64_t var2 = vget_lane_f64(var1, 0);
        int64_t var3 = vcvtd_s64_f64(var2);
        int64_t var4 = vsrid_n_s64(var3, var3, 1);
        float64_t var5 = vcvtd_n_f64_s64(var4, 1);
        return var5;
}
```

which in a Release build gives:
```
fatal error: error in backend: Cannot select: intrinsic %llvm.aarch64.neon.vcvtfxs2fp
```

[Full error log](https://github.com/llvm/llvm-project/files/8683239/2022_05_12_clang_arm_neon_backend_error.txt)

this can be reduced to the following IR:
(Godbolt link: https://godbolt.org/z/dGG6474P4 )
```
; Function Attrs: argmemonly mustprogress nofree nosync nounwind readonly willreturn uwtable
define dso_local noundef double @do_stuff(ptr nocapture noundef readnone %iVals, ptr nocapture noundef readnone %fVals, ptr nocapture noundef readonly %dVals) local_unnamed_addr #0 {
entry:
  %arrayidx = getelementptr inbounds double, ptr %dVals, i64 16
  %0 = load <1 x double>, ptr %arrayidx, align 8
  %vrndi_v1.i = call <1 x double> @llvm.nearbyint.v1f64(<1 x double> %0) #3
  %vget_lane = extractelement <1 x double> %vrndi_v1.i, i64 0
  %vcvtd_s64_f64.i = call i64 @llvm.aarch64.neon.fcvtzs.i64.f64(double %vget_lane) #3
  %1 = insertelement <1 x i64> poison, i64 %vcvtd_s64_f64.i, i64 0
  %vsrid_n_s647 = call <1 x i64> @llvm.aarch64.neon.vsri.v1i64(<1 x i64> %1, <1 x i64> %1, i32 1)
  %2 = extractelement <1 x i64> %vsrid_n_s647, i64 0
  %vcvtd_n_f64_s64 = call double @llvm.aarch64.neon.vcvtfxs2fp.f64.i64(i64 %2, i32 1)
  ret double %vcvtd_n_f64_s64
}

; Function Attrs: mustprogress nocallback nofree nosync nounwind readnone willreturn
declare <1 x i64> @llvm.aarch64.neon.vsri.v1i64(<1 x i64>, <1 x i64>, i32) #1

; Function Attrs: mustprogress nocallback nofree nosync nounwind readnone willreturn
declare double @llvm.aarch64.neon.vcvtfxs2fp.f64.i64(i64, i32) #1

; Function Attrs: mustprogress nocallback nofree nosync nounwind readnone speculatable willreturn
declare <1 x double> @llvm.nearbyint.v1f64(<1 x double>) #2

; Function Attrs: mustprogress nocallback nofree nosync nounwind readnone willreturn
declare i64 @llvm.aarch64.neon.fcvtzs.i64.f64(double) #1
```

The error about the vcvtfxs2fp intrinsic seems to be a downstream issue, since running llc in Debug mode gives the following assertion:
```
Assertion failed: Vec.getValueSizeInBits() == 128 && "unexpected vector size on extract_vector_elt!", file llvm-project\llvm\lib\Target\AArch64\AArch64ISelLowering.cpp, line 15025
```
at
```
>    llc.exe!tryCombineFixedPointConvert(llvm::SDNode * N, llvm::TargetLowering::DAGCombinerInfo & DCI, llvm::SelectionDAG & DAG) Line 15024 C++
        llc.exe!performIntrinsicCombine(llvm::SDNode * N, llvm::TargetLowering::DAGCombinerInfo & DCI, const llvm::AArch64Subtarget * Subtarget) Line 15999 C++
        llc.exe!llvm::AArch64TargetLowering::PerformDAGCombine(llvm::SDNode * N, llvm::TargetLowering::DAGCombinerInfo & DCI) Line 18773    C++
        llc.exe!`anonymous namespace'::DAGCombiner::combine(llvm::SDNode * N) Line 1787    C++
        llc.exe!`anonymous namespace'::DAGCombiner::Run(llvm::CombineLevel AtLevel) Line 1574      C++
        llc.exe!llvm::SelectionDAG::Combine(llvm::CombineLevel Level, llvm::AAResults * AA, llvm::CodeGenOpt::Level OptLevel) Line 24699        C++
        llc.exe!llvm::SelectionDAGISel::CodeGenAndEmitDAG() Line 917    C++
```

The DAG at that point:
```
SelectionDAG has 19 nodes:
  t8: v1i64 = BUILD_VECTOR Constant:i64<0>
    t0: ch = EntryToken
                  t19: f64 = fnearbyint ConstantFP:f64<0.000000e+00>
                t20: v1f64 = BUILD_VECTOR t19
              t5: f64 = extract_vector_elt t20, Constant:i64<0>
            t7: i64 = llvm.aarch64.neon.fcvtzs TargetConstant:i64<474>, t5
          t9: v1i64 = insert_vector_elt t8, t7, Constant:i64<0>
        t12: v1i64 = llvm.aarch64.neon.vsri TargetConstant:i64<630>, t8, t9, Constant:i32<1>
      t13: i64 = extract_vector_elt t12, Constant:i64<0>
    t15: f64 = llvm.aarch64.neon.vcvtfxs2fp TargetConstant:i64<626>, t13, Constant:i32<1>
  t17: ch,glue = CopyToReg t0, Register:f64 $d0, t15
  t18: ch = AArch64ISD::RET_FLAG t17, Register:f64 $d0, t17:1
```
which does initially appear to be invalid due to extract_vector_elt's args being only 64-bit

I have verified that this still repros on the latest trunk (b1aed14bfea07508e4b9d864168c1ae6b5b5c665)

For context: this code was produced by a fuzzer to test codegen, it was not manually written

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy9WV1z4rgS_TXkRTWUP8CYhzwQElKpys6kMtnZR0pYMmjGyJQlk2R-_T0tf0Igmd29OymCwVZ3n251H7XEKhevl38apdds9vgH-yxzzZS2hdJGJQYfGWeJLCzHpx23VhaaJbw00jC7kSzJtzuVyYKtePJDasFszpKCmw2DHk6q9jxTggm-HgRz3BGkUshVuWbbXMhGF4ZyY2BHQU7yIlPQiZFkY1fkiTRm4F0PvFn1_ihFmUjB8kKtleYZmw-CK7wwnlsG9Ou1LPCcxJUxpWTPG6kbtII9K7thScbhNeEstvvYYfv0xR-EtY1BEN_mYpVnlmVK_8B9trF2Z2hAsMBrXT0d5gV8W_zE_x83-4fv_s1fKRsE01pL5NWvWmmodJKV8HwQzmF4qRHx4WYQ3lQD0iznNhotLRP50tgyTYEjybWhG-Uqk4NgxsQ3nhmYYIPJVROWaS354kN2zwsPBq7ZPhP-Mo1GUNLqaU1AFeEMokrf-MobjK_pTnhWq19pLbRQtVoydVqmkggqibW0S8RbdlI-JcSxKFKvEQwrwWRvxdLgZisYnJcZVTKmUGKpSaqSCMlUc_XfQzvuGdVkslMyOiVcSFuiIkiyuz25Pj337v15o5JNVVePMpPcSLYqVSbYWu2l6bLvUDblFlkuiyIvKBHdB1JSlx3dm3Otc8sMlCaWbrRljGwcZ9l-O-S8SDbRaOhyjpxMX0yQ7t5Bi6RYlFltmWX52mVIfFQIqKZyNUR14QsZqi-fULnfCUywSFF2yNhFHMVhECLnFoEXBEtvvPSDpSvEZVMMy9qnpbM5tC-2Kyb3bjfKgDfgvGRFTQSgHar1NM-y_JnI7O7x3xSyuL2NRpPRw-h8IYdXbFHqxBHWzNqC1IFJ1lu5zXX2yralsfB_XYC6mM7TQkpczKtOcCk1QAqg58INflZZVqdS-Ww5lbmzImSqtGTC5MssT5ABJIqbNRewwcjr0cTOFhiQ8B0UyXYoGdE5tCALVEUcc_bx0PTjoQ46hrZ05DAuS635VoolF6LA49DraEoiJV_biWEkzIuCvyrx4goPLIH03WIYWVV6RdZMy3wVmM7inKloxPyop66iPZS0IIL12UsjDILt5Bujbk3K1FqzuKejore9P1ROGXzK3iij0Lua0litVq-oteHer4n2zVDAcmwdhGHfTMOJzop8sQVPGvdP2Ovjalz3-ur6TNmHTgMbtAcMkELipxni-bBC3mRVD9sJ3NUaAGbBcn0EF6oI6y5XJtcNyLfYTsLvSHvyJuy13pNekCBir_qxb8YDLNk6fVeFQcXnHYjgnanopPtQz89Eu3x03nRV-x4dD12MnDt1-IJTcMEXrDdhR0vW0Ur0DmcdERUBJQZ-j7McR3Sc1XAVeLyQ_27K3sxW7Xmdhv7vd-efzNlvA212Mikz7laMjybkn1BX7UHw-8P-d0nrKNanepknNAhVH8OxrljXMHQz2GuXjJRbQy0FGgyOYDyjawbgbbWVoMnFfilB84GVjnqNLEuoF7vudjWulzvqSNr9zbkeb9ZugFJOuxQK6zeZDEHFWO5K-VX9lHf6Slnjuvkp8QpRix_EcD3CC5eg1PIFWWHRFO1xgbcGcrTNqWltWd1eygyNFQjFkQv1Z-ygZxvPXSeHi1rh_QmtjaS7s5mbjO7T3VeZ3efPEsFbD5PdjtRl1LX4Yy8Yn_SU2zM9FTZBU0RzKF8QZh-9wjzfrqBroV6keMgxRfNc7xElRMDBQyjD2dfrzxR02hl9dtbbJxXqBl1173p2W2st7nSaU-jY9fzuUPCr66IxFxhdjZjdUsjvG8fAsNN601kT8gH0nSzSvNjeNTlVW_xvYFfbuk68npiv5co6Rc5E-63nxnQ6fd-NNzpPIXuofO0A_hdeNpjjySR8HzPSiYNaXrd5CSZCJ2p2PMGDyRsL1Y3kQ9CN7Uk8-f-afiz1gdn66b3cywzU6q696Zp8kHSn0_dA9XlztbH5QR49SlNm1rhAzGaHT-eI0K3UX3a2-l6pwddD2MEo-vUs6-MmXjmwNNPiZqusq8S41T_130zKWfanYqbzITok2hGbnKPig_LfcMP8KdYu0dufM2ZjImjXxbgO7-rPu_vr5beb-dOXRzankuTOgOtj5l57wsPwZz2STTZO8IY2RU859rzdgMM_609pfFpbStuFu7WzeMCAtLI09NwfInvlHZo90Bl4Ff70FH6yeELMjvs43i4oTiuy5AP3W3UTd05Rqzu31rOKKN7oxAa9bhDt-Fi3nR5OTrVbOUAaO8nJL8K1fnCo8XRXew5rFHoN1sru9Ngumiw0X0d2rR_2I3Qq4H7wCx5Y_2Di3utkz3qADqP2wA8_BG_9SZXhGLlG7-LMzvMd8vxRrin_oQGflLGODB2yYCS8ysC40xP3KqXtOK5r_rx5Wi7uUaJk7l2FhOZ0b1idx4lc0mG3sgqN6yvjux1KrG4B2zNsuIE7p9qoiaGjH4PRyh0pQ0U0-rRSts9Ad2CSPVpOLHepcofTjouUYcaiC0ZPjN7LUKdGjSO6emnoLLvUP-BJvPK5FP5olUruTcZeLEerqYijkR_FCR5Fq_FqnETR-OiwbIEGEP2BBWoKZHV2RmvbM1gN9qrjsxVcZmn586d0TjvLNGotq128dcPpeHHLdelC9FwoaxvKuhCXoZiGU35hlc3k5WB81faJmHf3gwAdeVYp1_5Y0DuUp7hRAQ2Cxame3P0ScfQ7xEVZZJd_-yTS9fB0FDkej_zJxeZSimAUenGQCM6j2A_kWPA09qJoMgrDNI4vMr6SmSGf4MyFuqSTS2_sh54HBvKHYRyGuBX5QgRezGPsWuQWDfzQVVlerC-KS4cBuwNDWxqkqOkeYlug1lrKRj8v7SYvLq-k_g7PLxzcS4f1fyjAy1M">