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

    <tr>
        <th>Summary</th>
        <td>
            [RISC-V] Miscompile with `-flto`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          patrick-rivos
      </td>
    </tr>
</table>

<pre>
    Testcase:
```c
int printf(const char *, ...);
long a;
long long b;
int c = -349518949;
unsigned long long d[1][20];
long long e[1][12], g[1][12];
int f[1][12];
short h[1][12][12];
unsigned long long i[1][12][12];
long long j[2][12][12][12][12][12];
unsigned short k[1][12][12][12][12][12];
unsigned char l[1][15];
unsigned short m[15][15][15];
unsigned char n[1][15][15];
unsigned long long o[1][15][15][15];
short p[22];
unsigned char q[22][22][22][22][22];
int w[15][15][50625];
short v[225];
void aa(int ab, unsigned long long ac[][20], long long ad[][12], int ae[][12],
 long long af[][12], short ag[][12][12], unsigned long long ah[][12][12],
        long long ai[][12][12][12][12][12],
 unsigned short aj[][12][12][12][12][12], unsigned char ak[][15],
 unsigned short al[][15][15], unsigned char am[][15][15],
        unsigned long long an[][15][15][15], short ao[],
        unsigned char ap[][22][22][22][22]) {
  for (unsigned r = 0; r < (unsigned)1085708641301355050; r = -40805543)
    for (short s = ao[r]; s; s++)
      for (int t = 0; t < ab + 349518971;
           t += (20091 ? ~2166664188148818947ULL : 0) - 2111069176)
        for (short u = 3; u < 18; u += (short)~-2147483629 + 21)
          a = ap[r][3][r][t][1] ?: ab;
}
void aq(long long *ab, int ac) { *ab ^= ac; }
void ar() {
 for (long x = 0; x < 2; ++x)
    for (long y = 0; y < 2; ++y)
      for (long z = 0; z < 2; ++z)
        for (long as = 0; as < 2; ++as)
 for (long at = 0; at < 12; ++at)
            for (long au = 0; au < 12; ++au)
              j[x][y][z][as][at][au] = 7;
  for (long av = 0; av < 12; ++av)
    for (long aw = 0; aw < 15; ++aw)
      for (long ax = 0; ax < 15; ++ax)
        m[av][aw][ax] = p[av] = 4;
  for (long ay = 0; ay < 2; ++ay)
    for (long az = 0; az < 2; ++az)
      for (long ba = 0; ba < 2; ++ba)
        for (long bb = 0; bb < 22; ++bb)
 for (long bc = 0; bc < 22; ++bc)
            q[ay][az][ba][bb][bc] = 0;
  for (long bd = 0; bd < 15; ++bd)
    for (long be = 0; be < 5; ++be)
      for (long bf = 0; bf < 5; ++bf)
        for (long bg = 0; bg < 15; ++bg)
          for (long bh = 0; bh < 5; ++bh)
 for (long bi = 0; bi < 15; ++bi)
              w[bd][be][bf + bg * 15 + bi] = 2;
  for (long bj = 0; bj < 15; ++bj)
    for (long bk = 0; bk < 15; ++bk)
      v[bj * 15 + bk] = 80;
}
int main() {
  ar();
 aa(c, d, e, f, g, h, i, j, k, l, m, n, o, p, q);
  aq(&b, a);
 printf("%llu\n", b);
}
```
Commands:
```bash
> /scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/build-llvm-linux/bin/clang -march=rv64gcv -flto -O3 red.c -o user-config.out -fsigned-char -fno-strict-aliasing -fwrapv
> QEMU_CPU=rv64,vlen=128,rvv_ta_all_1s=true,rvv_ma_all_1s=true,v=true,vext_spec=v1.0,zve32f=true,zve64f=true timeout --verbose -k 0.1 4 /scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/bin/qemu-riscv64 user-config.out
18424225731631039435

> /scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/build-llvm-linux/bin/clang -march=rv64gcv -O0 red.c -o user-config.out -fsigned-char -fno-strict-aliasing -fwrapv
> QEMU_CPU=rv64,vlen=128,rvv_ta_all_1s=true,rvv_ma_all_1s=true,v=true,vext_spec=v1.0,zve32f=true,zve64f=true timeout --verbose -k 0.1 4 /scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/bin/qemu-riscv64 user-config.out
18446744073360032667
```

Does not appear when using `-fuse-ld=lld`.

opt-bisect-limit points to `LoopVectorizePass`

Reduced LLVM IR:
```
target datalayout = "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128"
target triple = "riscv64-unknown-linux-gnu"

@w = global [15 x [15 x [50625 x i32]]] zeroinitializer

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(write)
declare void @llvm.masked.scatter.nxv4i32.nxv4p0(<vscale x 4 x i32>, <vscale x 4 x ptr>, i32 immarg, <vscale x 4 x i1>) #0

define i32 @main(<vscale x 4 x i32> %0, <vscale x 4 x i1> %1, <vscale x 4 x i32> %2, <vscale x 4 x i1> %3) #1 {
entry:
  tail call void @llvm.masked.scatter.nxv4i32.nxv4p0(<vscale x 4 x i32> %0, <vscale x 4 x ptr> shufflevector (<vscale x 4 x ptr> insertelement (<vscale x 4 x ptr> poison, ptr @w, i64 0), <vscale x 4 x ptr> poison, <vscale x 4 x i32> zeroinitializer), i32 0, <vscale x 4 x i1> %1)
 br label %for.cond4.preheader.us.i

for.cond4.preheader.us.i: ; preds = %for.cond4.preheader.us.i, %entry
  br i1 true, label %aa.exit, label %for.cond4.preheader.us.i

aa.exit: ; preds = %for.cond4.preheader.us.i
  %call = tail call i32 (...) @printf()
  ret i32 0
}

declare i32 @printf(...)

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(write) }
attributes #1 = { "target-features"="+64bit,+a,+c,+d,+f,+m,+relax,+v,+zicsr,+zifencei,+zmmul,+zve32f,+zve32x,+zve64d,+zve64f,+zve64x,+zvl128b,+zvl32b,+zvl64b,-b,-e,-experimental-smctr,-experimental-smmpm,-experimental-smnpm,-experimental-ssctr,-experimental-ssnpm,-experimental-sspm,-experimental-supm,-experimental-zalasr,-experimental-zicfilp,-experimental-zicfiss,-experimental-zvbc32e,-experimental-zvkgs,-h,-shcounterenw,-shgatpa,-shtvala,-shvsatpa,-shvstvala,-shvstvecd,-smaia,-smcdeleg,-smcsrind,-smepmp,-smstateen,-ssaia,-ssccfg,-ssccptr,-sscofpmf,-sscounterenw,-sscsrind,-ssqosid,-ssstateen,-ssstrict,-sstc,-sstvala,-sstvecd,-ssu64xl,-svade,-svadu,-svbare,-svinval,-svnapot,-svpbmt,-xcvalu,-xcvbi,-xcvbitmanip,-xcvelw,-xcvmac,-xcvmem,-xcvsimd,-xsfcease,-xsfvcp,-xsfvfnrclipxfqf,-xsfvfwmaccqqq,-xsfvqmaccdod,-xsfvqmaccqoq,-xsifivecdiscarddlone,-xsifivecflushdlone,-xtheadba,-xtheadbb,-xtheadbs,-xtheadcmo,-xtheadcondmov,-xtheadfmemidx,-xtheadmac,-xtheadmemidx,-xtheadmempair,-xtheadsync,-xtheadvdot,-xventanacondops,-xwchc,-za128rs,-za64rs,-zaamo,-zabha,-zacas,-zalrsc,-zama16b,-zawrs,-zba,-zbb,-zbc,-zbkb,-zbkc,-zbkx,-zbs,-zca,-zcb,-zcd,-zce,-zcf,-zcmop,-zcmp,-zcmt,-zdinx,-zfa,-zfbfmin,-zfh,-zfhmin,-zfinx,-zhinx,-zhinxmin,-zic64b,-zicbom,-zicbop,-zicboz,-ziccamoa,-ziccif,-zicclsm,-ziccrse,-zicntr,-zicond,-zihintntl,-zihintpause,-zihpm,-zimop,-zk,-zkn,-zknd,-zkne,-zknh,-zkr,-zks,-zksed,-zksh,-zkt,-ztso,-zvbb,-zvbc,-zvfbfmin,-zvfbfwma,-zvfh,-zvfhmin,-zvkb,-zvkg,-zvkn,-zvknc,-zvkned,-zvkng,-zvknha,-zvknhb,-zvks,-zvksc,-zvksed,-zvksg,-zvksh,-zvkt,-zvl1024b,-zvl16384b,-zvl2048b,-zvl256b,-zvl32768b,-zvl4096b,-zvl512b,-zvl65536b,-zvl8192b" }

!llvm.module.flags = !{!0}

!0 = !{i32 1, !"target-abi", !"lp64d"}

```

Reproducer:
```
/scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/build-llvm-linux/bin/clang -march=rv64gcv -flto -fuse-ld=lld -opt-bisect-limit=0 $1 -o user-config-bad.out -fsigned-char -fno-strict-aliasing -fwrapv -Wl,-mllvm,-opt-bisect-limit=0 2> /dev/null
/scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/build-llvm-linux/bin/clang -march=rv64gcv -O0 $1 -o user-config-good.out -fsigned-char -fno-strict-aliasing -fwrapv
BAD="$(QEMU_CPU=rv64,vlen=128,rvv_ta_all_1s=true,rvv_ma_all_1s=true,v=true,vext_spec=v1.0,zve32f=true,zve64f=true timeout --verbose -k 0.1 4 /scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/bin/qemu-riscv64 user-config-bad.out)"
GOOD="$(QEMU_CPU=rv64,vlen=128,rvv_ta_all_1s=true,rvv_ma_all_1s=true,v=true,vext_spec=v1.0,zve32f=true,zve64f=true timeout --verbose -k 0.1 4 /scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/bin/qemu-riscv64 user-config-good.out)"

echo $GOOD
echo $BAD
```

Output:
```
> ./min.sh reduced.ll

*
```

Found via fuzzer.

This was a somewhat strange reduction so if there are issues reproducing please let me know and I'll re-reduce.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWstv5DaT_2voC6GGRD1affDBdo8XASaYb-dLsscBRVEtTlOUTFLqdh_yty_40KNfTgbZRQ5fDINVLNavWCwWX7KxUmwnKH0E6TNItw-413UrHzusJSP7QLKhVQ9FW74__kKVJlhRED-BcAvCJ5CF7pe4OhMadpIJXQGUk1YoDUmNJQToCaAXuFqtANqA-Nlp81bsID6v2qKYZMYggSDewiBONmmUb5IZ3wvreAlnZAnS5wikW5A-o9DQa-N0VomQoegF7i5ly_6re42qbqWG9WXzpdoNN9kfYWbV72Yot1Tv0atunZv7e13-aTt2JvnCTPpBd82kcElv2xWXdu-qz6Fp72Eusc6lzkTyg6G9Te1_RJfZcbjRexpm6IYDgzVw1jC0rIQYA5QbW7gwyXhjpJi4tTmlNXpZtpZT65TR1hy9krtel9jqGuu8xbuLloXGLRfru-q-U_-zgLA7kHt0MnWRbPj7DxuC53OP97OF9MOu-IXiDLg02dzVPA_IrWCKO9hFb96f1mveteqc6eYE-jC10QaC9fNoqmrN3p1PtqTdikMQP1v2ZdkI0CYK83Qd5lkSxWEUp2mYTqpbGCRhHqZpEpsjYHLV9-AGo6yiHZJ0qwQqV6Bn-7tZjtFDTabr2S9t_cIFBOgZ-jNjHU0LDs4_2qgYHEA5CsNNBEH8Cn9HUZZlWRLleZTkuTlx1r9-_gxB_ARDE54AoiiKwmwTrbMLjy6G01uvYuNVb72Kcs9P_VpFgDa_ByhK1kkeZ2YC0DNE0ZVtCLGLTzfGJ32OHfE17VMEpFszFuMyns9SsN4uN503gPI54wB6cruP3TiIzwMnhiD9ZDsmxv0LMxKg_DxrfAys2eM8MUcbAmRN2Ok83koEi3qfUe-XqPfbWWBxpxl3usSd7s2VW3Bqhlr-DIvVDD5DLfIOu8SLljB9Yw4v-u0XFvprC_1NC9DeCo5utt8dOTmClac-F3DvkmEL14s1cObCsHBhuHZhuDtN-LBAHhwyXSAPH0wVXmQGPl5jj1cDN9spHvyoDp4ex9F1Y6utJffGusgsfJVa-P3-UBepha9yC18m1xJa4Blq-TNogT_My6JYgAsHXqKL24lZkAWMXMPIzbQyFyDs0wn7fCqwp4WnZIxxeCfGRbnou7ya2aK8G-SCLpDUIpdA-lGQqwW0uoJWHwd5twDvrj3e3YjWGb5e4Ourzus7c8QWKHbdK7uz9M2Fsyj9bFBPK3toFHYfh1HqamycKnRvqr4vXPh-7cL3-1O1XyD318j9hfPm6mt6WHi3H73Lw-sjypxCDWbi6nCZDpx5SPb6TMzZVZqCmqJyrzr0Amt7qJniuyn29upsisYUwhStKTpTvJ0ZdmckQJk9GPFZ2_TKBQgBlHLeg_RF2MoLLJaq05imx7KrvrRNg0Wprh_TBVa1F8WfIECvikisSQ3QqyaBpkozsXMV0jYd41QGVX86BVr2Yg_Qa9EzXgY7Mkw850MTcCb6oxGZuL4SjsUOBg2WpAbxVg5ZsiMDDCquWxh8iaGk5YrAoIW9ojIgrajYbtX2GgaVu_EF9moZVKINlJaM6ABzhhUzZquDxN0wj-K_P_3867eXf_3qewLoZeBUgHgbmRC-yGH4pvE3zPm3SIF4q2VPvbi5Fg8Llh71N9VRAuLtEK1CgF5OA41RNaucBpolYx1q1lA7iGCgsmgVhcEehqsIJn850jasb7TpA8kUGbLkMnIuHFGeoAShdB1HWRyF8SaJUx-ov23Sv4T_TPf_33Qn2TpJwnUcZ2EYoyxb39wQXLltqYKi1RB3HcUSHmoqYG-jDLIwqHpFA16CeMt5CbJwtcS2nQ4KpijRAWcN07BrmdAK6tZgP7dt9xslupXsRP-Flbro-Sste0JL-Pnzbz_Dn75e70uuqrHcUQ1LrDHH7ya27i2DaNCA-IkGHYifssQWAZsYM_HxU4TyQMTIyf4due1zaVZL1nE6mvSBDXqxF-1BuGQOdqKfYL5MQncX3fG2wBzad7J5cczUfpOBR8hi9941v_BEZcsE0wxzdqLyfBU-w9deEM1aAZ-0lmajhqIlmPMCkz0UbSUphaJV74JA0fbiwEQJD4xzSXUvBWxo08p3gPKDZHq-vZSUcCwptO8nkIRmma4arPa0XCmCtaZyJY5DwmJkaReaYyZ-GRTBnMIjTPww4k_msLls6bT0LSxGkDUNlrtbeiyyaua5GZ_lQUkrJqhFgyQcT-Gb_UOA0vCucdMa3WydwOhDcOzdi-YLABVavk-pCaHGjEMzJ_8X4bw7HBdTqOq-qjgd7CKCN8x4PSYUlZpy2lChP9DrWqZaewXptDS-H-y0ZYn90vCBIzPwzkAuE9tZM1P6h9M13tsKCTkuKDfiqpUr0ooyWXWS1hSXVK56tWLLtLmrEz9Bs5g6SUvlF_Z9g8Y5lLpZ9lNcSMgi6Hf32SeMV_TI9Jnsz_g54n7ILe8KQKnNNaM-Z55dKSh3f90w07i4HE63YEm1j__FrfBsT_CLbjLg_2KydF9ryYpeU2UXrvN8_fwXd6b5q865_WiyDxByW3RQUax7SZXZg-OtvfI-Z0lhp8I8hh0hjpSOVI40jkjKzQPfsIMjJ0aUHNmKCkKZrzVNzz3rDvqZP058lpQLvlrwkw6PUF5MlRjNfJYYPrAFtcWxo5KZtYt5oBqi5Q1p0zU3pOKWVN20oG7r3hL2N4QnzLG6NntipGK8uy1X6lo-FCRG18M-Dfud1Tbvp0DVpO2FppKKg6vvsO6wY_WAuWcHNYsHddagB0pKW2kwc9KGlJTTneeVZMIr0K7pHKc01pQKW1EjThFS7Uauc7FVirRV11Qjf-atWhhXb61inj2z7u60jtfE02kEC_9VnyVHbtkBl3RkescUWHoREwP2agJ3rTM9dEVjuSMZMO89Zx77ntENFqzzVcoPnmswGTnaeE6xxnp0VBWhWFHPD6QbuUpIwll3rN6qSXRoMCFvb2-j4M3Uy7Y8q7-1vp1VzAycKYJlWfJW0KW84r2qZ6k2W2aBF3yx4NXMk6ZdVFpRNu0wC6qGNqw8zoJx8K5y2UibDjM5C8yuN9eG0kX-OJjEFtj01nbOlwOpreYJRyiXyrFZMnLYeXnCRY0dQ7Bv4lJ5ZIMj-30gOOGDB7oInNzgT4VTLPa-uh_rR0cdhjgMcUou006EOlI50rSdZ0ZqR3YqmXC2KmekKqqGCcfWnkyCUbdeMmMrI34zPDFStM3EdRN38hzBTYtHnlUjx9UIItIl5IkR4ZboiZnYO65mQgvN50qH-1G_7ryNcbx7VwpPSk-pp26Ie9fHXnlCvZryzS5UWrkpHfzkDH52hkXMDH9osOfrkU7NfiKH_c7TUS7IyPjOh72YdHwKGW7Eq5GOODXh1Ijz7g_e_4FHIfJTNPAoi_OpgsIkn_g0G9kYrbNJnoSbqSGN0MhmaRpP8jzamAYEL64oAEXuat2WPaeriuPdeG-KzPUcReE1IlxomLuNew6gaL5NYLP3oVnMO3uYo0tbt97KX2knW_Nolfceq3_Px7OzRzoMLp_lIN6GEKAkuvjaEhS4_MEvLjD4H7uIGuOjYW725d82ryU1gxI9539PdL7cHvaubX903M7_56fteANNAMr_4z86jQlkn3v-A8l_ffnyT5BuptsySv7jAqlbk6E2ZmcSk2n396Evve56fXcPij_BFUCvDRMrVUPpPrOtpkXol-JHG91r24sSDgxDM2gqz776_VIzBQ9YQQxV29BDjTVUWmKxo64z-wlLtZBVUNdUUmhfmkr1VEHpt1CztjpubpGQUw0bCveiPUAsSvgTQGvOoaSBc331UD7G5Sbe4Af6GK1RHifrKNw81I8liZMijDYoKqOKVCHKcZ5XxQYXOS6SCD-wRxSiJArDPAxRGm5WNMvSDcIoXue0DDdrkIS0wYyv7FHTyt2D9fMxiqIkzR_sQ1_Zf1RESNCDGwWw_7ryIB_tVlT0OwWSkDOl1WxGM83tfzh-_enfL8FvIN3Cn5nyuQQPTNfu8yrXLcjCh17yx1rrzv51Br0C9Lpjuu6LFTG3ole321oSdLL9Ts3D4dWFFKBX7-3wiP43AAD__w4O6qE">