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

    <tr>
        <th>Summary</th>
        <td>
            [SROA] Incorrect poison propagation
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            miscompilation,
            llvm:optimizations
      </td>
    </tr>

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

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

<pre>
    ```llvm
; RUN: opt -S -passes=sroa < %a

define i8 @test(i1 %cond) {
start:
  %a = alloca i8, align 1
  br i1 %cond, label %bb1, label %bb2

bb1:
  store i8 poison, ptr %a, align 1
  br label %exit

bb2:
  br label %exit

exit:
  %5 = load i8, ptr %a, align 1
  ret i8 %5
}
```
Results in:
```llvm
define i8 @test(i1 %cond) {
  br i1 %cond, label %bb1, label %bb2

bb1: ; preds = %start
  br label %exit

bb2:                                              ; preds = %start
  br label %exit

exit: ; preds = %bb2, %bb1
  ret i8 poison
}
```

This is incorrect. If `%cond` is false, then the result must be undef, not poison.

The original test case is more along these lines (not sure yet whether the root cause is always the same):
```llvm
define i24 @test(i1 %cond) {
start:
  %a = alloca [3 x i8], align 1
  %b = alloca [1 x i8], align 1
  %a.1 = getelementptr inbounds i8, ptr %a, i64 1
  store i8 1, ptr %a, align 1
  store i8 1, ptr %a.1, align 1
  br i1 %cond, label %bb1, label %bb2

bb1:
  %b.1 = getelementptr inbounds i8, ptr %b, i64 1
  %oob = load i8, ptr %b.1, align 1
  %a.2 = getelementptr inbounds i8, ptr %a, i64 2
  store i8 %oob, ptr %a.2, align 1
  br label %exit

bb2:
  br label %exit

exit:
  %5 = load i24, ptr %a, align 1
  ret i24 %5
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEVs1u4zYQfhrqMohBjURLOuiQxDCwlxbItg9ASbTNliIFDrW76dMXpJQfb1w36aLYQGBMz_Cb-ebjjCyJ9NEq1TJxx8Quk3M4Od9a_afus84Njy3b8uUx5svI-I7xW1bcwcPvv7DiFtwU4OYz3EySSBErduSdBFbcA0MhV_e0DuqgrQJdAyt5UBQY1jqPbr2zA8MGWHW3uFKQPrBiPQgJClixA2mM6yXomuE9SKOPFvInp87Da7h7MLJTJn7Rdfl3e3ydWDS_xKLgfMpycpqcjQen4Bc2F4M-w6pvOpzj4ivca55pf0ZXJLrGyWEleyUHr0KqKgqxgla79cOTdMv2QdFsAoG2z8EuiPsBnX646BBv0uTVQIkvQ7FI_-7qwof-_nu0VaG3CDENvH8ifK7IeoOuarKsv500QXxs77xXfdjApwNEp7WyWx7NB2lIxXDhpGxcwCdJYZwpQKdgtoM6RAfrwhp-cx5HgfP6qK00ELWFXpKK0GO89dI4e4y4pMBoqwgY1hGKZq_gUQX4elLhpPwS27l4fl4ApPkqHykZSI6KYfOeS4blj08DJu4K-Bb7ROwutEeU5jv3_Lq73OTpwFEFZdSobIjdp23nZjvQhYbU2_IF4HmA5P_St5cdN_n_N9ui_QPcujfcGArnun-YTd3F1BMn_Hg98U2ZluBntcKfNJKxfM9Mjpf7ylDOhrYYmqKRmWrzCjmvRSlEdmpxqBuUpWyqetsfDnnXcCE4HvKi2B6qocp0ixxLXvGSNwUXYlPlJZZ1I2pZ1F1XISu5GqU2m9hxG-ePmSaaVdtUFccskab0xkccNfVunLSRQcfXXSwpQ0ytWty6KehR_5VsFI1il_k2Gm-6-Uis5EZToJc4QQeTfkx8fvj1lokdfHoaaes8gsm7SR4TYjZ7055CmCiWGvcM90cdTnO36d3IcJ-SWP7dTN79ofrAcJ-oEMP9wuZLi38HAAD__3clcBE">