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

    <tr>
        <th>Summary</th>
        <td>
            [InstCombine][FuncAttrs] InstCombine breaks `initializes` attribute
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            miscompilation,
            llvm:instcombine,
            miscompilation:undef,
            generated by fuzzer
      </td>
    </tr>

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

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

<pre>
    Reproducer: https://alive2.llvm.org/ce/z/rx6rJk
```
; bin/opt -passes=instcombine test.ll -S

define fastcc void @src(ptr initializes((0, 48)) %0) {
  %2 = alloca [24 x i8], align 8
  store i8 0, ptr %0, align 16
  %3 = getelementptr i8, ptr %0, i64 1
  store i8 0, ptr %3, align 1
  %4 = getelementptr i8, ptr %0, i64 2
  store i16 0, ptr %4, align 2
  %5 = getelementptr i8, ptr %0, i64 4
  store i32 0, ptr %5, align 4
  %6 = getelementptr i8, ptr %0, i64 8
  store i16 0, ptr %6, align 8
  %7 = getelementptr i8, ptr %0, i64 10
  store i16 0, ptr %7, align 2
  %8 = getelementptr i8, ptr %0, i64 12
  store i32 0, ptr %8, align 4
  %9 = getelementptr i8, ptr %0, i64 16
  store double 0.000000e+00, ptr %9, align 16
  %10 = getelementptr i8, ptr %0, i64 24
  call void @llvm.memcpy.p0.p0.i64(ptr %10, ptr %2, i64 24, i1 false)
  ret void
}
```
After InstCombine, the last memcpy is dropped as the source buffer is uninitialized (filled with undef (in llvm)/poison (in alive2)).

Should we adjust `initializes` to only account for writing with well-defined values?
Generated with rustlantis + llubi.
Original rust mir program: https://gist.github.com/dtcxzyw/78250ce921833ea20c5cb040d29f1a3f

cc @haopliu @nikic
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyMld1uozgUx5_GuTlqZI6BwAUXZCJWuzcr7TyBMQfiGYORbdppn35laFqm260SIUF87J-Pz8ff0ns9TEQVy84suxzkEq7WVV1Qv16enw6t7Z6rf2h2tlsUOSZquIYweyZqhg3DRhr9SHg05nE8WjcwbBQxbF4YNu5X7v76yXjNcv768JqJM7R6YtjYOcDDLL0nz8RFTz4oO7Z6Igjkw9EYePgeF_C6oz4O99IHpeDR6g5Yyr1TDIs5ONCTDloa_UKeYcGw4Ay_QVowLBmWwDDj6_t0ZryG-B-BiQtIY6ySwLIzpvALdMGyS1wpjR4mKNbJPlhHoAtYmXG3DXebleQ3pliZAwUyNNIUVs-Kj6t0nkLy_2SxI9_A6d1g3IOT_Ddy-k7GGzm7m5zuyQJ_I2fv5PRGzu8mF1_4nH_MBsPsdH-Y-Rfo0yfhKO5H4xfxKD6JR3k_Ot-hO7u0hoAf-fojhme-36r8rBATfn_BbA4qacxbX62tPNKo5ufjzOOj8_S101b6DoQ7UPxKoJfGU2y8yHUUVmxs49PlgxLUfSAHf04-fNv6PhLClcBIH2BzALSHztl5pg6kX63eLk4RtEvfk4v2ZXrv_w4YFr02hjp40uEKy9RRHwf1BPFgqyQ0s9XeTq_Dm4JtWnHcBOf71S6mgycC2f1YfACW873I5ByCBTuZZ5BK2WUK0FsHT04HPQ3bzk9kzMOmXB08SrNEmWsYr_-giZwMNw_d4oORU9AeGJ7BmKXV0Y2_nR70JM06AUbtYHZ2cHL8rwYP2ofjoMN1aY_KjgybV_lm2JwKzLiiEpNCCJLIVaZanvIOyz6Rot8OrFTM_FXa2eglfk76p1aHrhJdKUp5oCo5pVgWKPLycK1EUmZ5jmmWZZL36SnBvk0U7zGXqHKUB10hx4wLzHmZ5rw8JohZLrksRCdUKpGlnEapzdvFcdDeL1QlQvCsPBjZkvHrnYQ4aq_sOGsjg7YTw1h0DHFNp6h3F8eb6cMKUa9l8GYe3jLQPkO_vLyQi7bscnBVpD60y-BjJ2gf_LuHQQez3pP7ms0uLDs3y6TqEJxn2WVf0dA6kj_9J-UjQ3C6XQIdFmeqj-ncZXIr2vX1MDv7g1Rg2KzB8gyb13g9VvhvAAAA__8la1QR">