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

    <tr>
        <th>Summary</th>
        <td>
            [Clang][LoopAccessAnalysis] Stride might be wrongly replaced by 1 in certain situation. 
        </td>
    </tr>

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

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

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

<pre>
    Recently when I'm trying loop vectorize on llvm 17.x version, in a certain case I found when storing value into array sometimes it stored into wrong position. Here is a case reduced from the case I met with the problem:
```
extern int a[];
extern bool b[];
template <typename c> c d(c, c);
void e(long f, long long g[][1][1][1]) {
  if (d(g[4][4][4][0], (long long)e))
    for (int h = 0; h < 1; h += (int)f + 7)
      a[h * 3] = b[h];
}
```
When compile with flag: -std=c++11 --target=riscv64-unknown-linux -march=rv64imafdcv -fPIC  -w -fopenmp-simd -O3
there is
  ```
%add = shl i64 %f, 32
  %sext = add i64 %add, 30064771072
  %1 = ashr exact i64 %sext, 32
```
and %1 is the stride equal to (int)f + 7 .
When turns on debug flag there is debug log: 
`LAA: Replacing SCEV: {@b,+,%1}<nw><%for.body> by: {@b,+,1}<nw><%for.body>`
and in vplan there is 
`vp<%4>    = SCALAR-STEPS vp<%2>, ir<1>`
That is the stride is wrongly replaced by 1.

In my opinion such versioning should be applied on the strides of symbolically striding memory
accesses. So I checked the source code and found the symbolic stride is collected in getStrideFromPointer:
```
const SCEVUnknown *U = dyn_cast<SCEVUnknown>(V);
  if (!U) {
    const auto *C = dyn_cast<SCEVIntegralCastExpr>(V);
    if (!C)
      return nullptr;
    U = dyn_cast<SCEVUnknown>(C->getOperand());
    if (!U)
      return nullptr;

    // Match legacy behavior - this is not needed for correctness
    if (!getUniqueCastUse(U->getValue(), Lp, V->getType()))
      return nullptr;
  }

  return V;
```
The value V is regard as symbolic value when dyn_cast<SCEVUnknown>(V) returns a SCEVUnknown. However, in the case I post the stride has pattern:
```
        X = Shl A, n
        Y = Add X, c
        Z = AShr Y, m
        n, c and m are constants.
```
which is not supported in createSCEV on branch 17.x, and createSCEV return getUnknown when processing 1%, making 1% regard as symbolic stride value and replaced by 1 later.

I checked source code on main branch and found the ashr pattern is supported, so the case I post will not report error. But still in any case dyn_cast<SCEVUnknown>(V) returns a SCEVUnknown will return V as symbolic value, and this might be a risk. 
I think returning a SCEVUnknown is not equal to regarding V as symbolic value because unsupported patterns in createSCEV will also return a SCEVUnknown, and in my opinion there should be an extra check to stop these unsupported pattern value being regard as symbolic value.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycV19v4zgO_zTKC5HAlvP3IQ-J22ILzGEH02lv514OsszYusqSV5KTZj79gbLTJJ30dnFF4STm_x8pkhLeq8ogrtlsy2Z3I9GF2rr1j878xJ91t5qOClse199Qogn6CIcaDTwyvmgguKMyFWhrW9ijDNapnwjWgNb7BtLF5A326LyyhvEclAEBEl0QyoAUHuERdrYzZa_Sk7ipYC90h6BMsCCcE0fwtsGgGvSgQuTCsicfnDUVtNaroKyZwG_oEJQnK6TdYdlJLGHnbAOhxpPNBgMcVKjju9bZQmPDsg1L7liyYfNk-I8_8S2gM2QORI8Py7ZXpMJaDcUHWsCm1SIgsCwPxxaNaBAky-5BQsn4UhIekvHVu8TeqhKQ8aWmmHZEj9_ioxrUz7bprx98BWwxaAFQO2B8STZIaNrzXX8kUSqHkzF6ML5CcoevTooAdtYRD8VeA8vuIGHZNn7NIR2-8i0Rei7GV2R8C4srNRCRI94NZGx2F1URYPUlYmxxdzMB_6TSkLZplcY-azstKpZtYOxDybI7ST7wbZrCeByEqzCw7M4pL_fz6bgzr8YezFgr073BuBFO1kTez6eqEbtS7mG8-_qYA4wPMN7ZFk3Tjr1qShj_ng25rPuyOkX0wUHGZ6IsY1C-1qDmU2B8FhOY8XcZPvP4FiIXcQ9coiwjX5LMp4tFmiwuBdKe29cO8E3IcBIiRZfaP_gjTNlLKx8L3AenSgT8sxMagv0lVzC5ADp0zng6wCUWXRWhhlP8wzttI_rvtr9sNvT7G7ZaSDq_T_n9S-RYbNk0KRjPY4ZycoqynOXmwLJ7ltGbnXUTai90NIrjLbH_KXMVtTKwb7UwZ4_fndy3veiU7ABEZJ_yzZfNt_HT9_uvT3Bi4KSUepVjWZ5eWvhei_ABU-X7FqSP4GL4WEJxhHRAtH8-GmiOYFtllDXgO1mfeiKB5Wvb6RIKBNG2WmFJ4J9NeLA78MemsFpJofWxf0-SDTbWHYfopUTv0U_gycIjyBrlK5a9Hts5iSBtiUAg9Q03Uga1F9FIqzXKEPsrVBieIuXB2earVSag-6xNSmt8iJl_7k8cnfbnCHN5NP-WwgeW5Rf0CPPy5bIDnnoX4-nzh6YG0BsQXSzgTX5L86MJWDmhc-HD_Vvrbpq4MJJ_6FIOqfrBdFq3wV3J_HUk-Zhl9xWG31t0wpTRwupT089_z_SZhfEHxh_gHyLIGjRWQh6hwFrslXUwhlArT_kzNoBBLGnoWQfSOocyGPT-hhMVhmej_uyQAHv2NHuehyheaASfYsjhS0vPl4H4_djiOb6_ieG5vQ8vBs6Xc7DXFfW9xmETeKHIHFbClSD8uWx7alwd_qrGBmu0GVzQJ_CbPeAe3bCcXKwIrfXh8qTXwkMrAg38z44ADH9_9M2l1rAhveaa-iNSN2UJf_QrwBX1Xz31qXbwg8jNNTluUTIe4waEw_5UCBP85KZLh1rJ-lQXvmtb64azLR2KgIQF9ZvCCSPruK-RBdJ_wTBkKpZLf7Yj5q2z1HSoFaWMz6K74vX081bCBiz7vJGRq6YJtC-569b53skuu5g10NAGOXh93dTiuBwyRZG_R03-eftLjg9K6wiPQ-IDdM66CWw72jSJRkurOfYy_1-Z9TZO9f5rCZ8gj4e4UVUd4jgAp_zrBE5IhFqZ10ELgXxtYsjx-5Dv0Se-GwahQCk6j9CZc1EMmPkP1RF9F9rbUwBXdk-uq6sZ14_fi8lmAN-CE302yT0fbEtst31495L8_-zgT0blOitX2UqMcJ0u0mWymk3T5aheJ7yYJ4mYSS5Xs2S1TMQ0Ectklu6mq5lI05Fa84RPk3maJstpli0nUu6m2XwlORc7XpSSTRNshNITusZMrKtGyvsO16tZspyPtChQ-3hb4lxqQcszp4uTWxP_uOgqz6aJVj74s4aggo5XrDxKxEX8i7XtJo7ujRH66JWn9bgfuudKuLlixDQNVymvQif6G9Coc3pdh9B6alNxaFQq1F0xkbZh_IHcGT7GrbP_QRkYf4jRecYf-gD3a_7fAAAA__-VWkz4">