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

    <tr>
        <th>Summary</th>
        <td>
            Merge e02f4976acbf086904bf3903348603cc0f04e6ad into 14.x
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            llvm:codegen,
            release:backport
      </td>
    </tr>

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

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

<pre>
    clang 14.0.x releases can miscompile Doxygen causing it to segfault. A reduced test for this is

```c
struct S {
    char *a;
    unsigned b, c;
};

void foo(struct S *);
void bar(unsigned n)
{
    struct S s[5];
    for (unsigned i = 0; i < 5; i++) {
      s[i].a = 0;
      s[i].b = 0;
      s[i].c = 0;
    }
    for (unsigned i = 0; i < 5; i++) {
      if (n > s[i].c) {
        unsigned c = n * 2;
        void *a = __builtin_realloc(s[i].a, c);
        if (!a)
          break;
        s[i].a = a;
        s[i].c = c;
      }
      s[i].b = n;
    }
    foo(s);
}
```

When compiling with clang -O2, the assembly shows that the allocation is optimised away, `foo` is always called with `s[i].a` to a null pointer and `s[i].c` to zero.

The bug is in LoopIdiomRecognizePass which optimises the first loop to a memset with wrong aliasing info, which then causes `n > s[i].c` to be mis-optimised to `false` in the second loop. This is fixed on main by e02f4976acbf086904bf3903348603cc0f04e6ad which applies cleanly to 14.0.x and fixes the bug there too.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJytVU2PnDgQ_TX0xRrkMV_NgUNPeiOtlGhX2Uh7HBXGgDNuG9lmejq_PmXTYZiPRHvYFmrA9Vz16pWraE13abgCPZDbPKXpE7FCCXDCEQ6anKTj5jRJJcjRPF0GoXF5dhLh0hNviBNDD7PyKTngzm7moiNeOE96Y4kfpSPSJfSY0MP1v6TLxZd35-3MPfmHJNXdskLwx0ewJGEHSLLN6qydHDQGaBP2gfDVllTH5-f4_2hkhwxMwvbPAdghYfUKjJAWLEJWvzoAri43cVcXLinuiqQ4vmAVEt06kSTJjoQiJj5-IEV8TNhdvOqXmZLoVKLTFNaN75rb35v5O-YgzP_GU_Zhu0boH5uo7wA3hVpI6aA9Ya-YExJLEKocUff37SyVl_reClDK8FC8VZul4pv6_XSy0ErYLazFI-uvRVcPb7a8Uhx-DVj481eAF7K-qZD-XQniidymsdrXxtie43_H0HCxAUPLnaUfydKsN3-xIIkfBQHnxKlVF-JGc3a4BH5ZDyKCl0ZjDxIzeYndjEWBM1zCXowVCJU0mEHhauh5pRASA6Floz_CsN2B6FkpMhmpvbAEdPcCxq-w78KadJvIV-TTzkOIJDX5ZMz0ZyfN6YvgZtDyu_gbkyDnUfJxJepiEr20OEwUbljCn8TJCb8QPFuDSoCSsAwk3ZuQ1-LGj9dZhY6Q1ZtzuxBtRRhxN8_i4FrQBZQTURkdWTjkiakGGin5ukw1pPaEG1DdEyCsvRBBWZ_XVQm87em-rGne9llNsyzflzTjnPY0FyV0V4YwTUqGOYvzVmP5MPR1BAdZg_dFgqAb3q1AhEl3XZN1dVbDzkuvRPNZ2EH899BYtxjmaTdb1YzeTy7JcDB-xGtAUec2xfOGL0o9_rzdTNZ8E9zjq3RuFniAPxZFRfPd2FRiD33O93uo2pzedkVb1Ld1VZV7nld7BjsFrVCuQeETxqLT7MBNJ_BTggvxHDJ2_eagqQX-MBnrg6047mTDKGO0YCWlRUbrVLTASoCSVV0ligqSnArUX6XBdWrssLNN5IyqOTQq6bx7NuIxC5NJXPl454VS4SMQo8HsR2Ob8bGT3x52MdcmJvoDuYEKxg">