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

    <tr>
        <th>Summary</th>
        <td>
            Missed constant folding through control flow
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          GINN-Imp
      </td>
    </tr>
</table>

<pre>
    https://godbolt.org/z/K5K6f9918
https://alive2.llvm.org/ce/z/SicZdr

For the following code, through control flow, it can be deduced that %1 is always false in block %6, but LLVM fails to leverage this fact to optimize `store i1 %1, ptr %0, align 4`

```llvm
define noundef i32 @Abc_NtkOrchSA(ptr %0, i1 %1, i1 %2) local_unnamed_addr {
  br i1 %2, label %4, label %5

4:
  br i1 %1, label %common.ret, label %5

5:
  br i1 %2, label %6, label %common.ret

common.ret:
  ret i32 0

6:
  store i1 %1, ptr %0, align 4
  br label %common.ret
}
```

opt -O3:
```llvm
define noundef i32 @src(ptr writeonly captures(none) %0, i1 %1, i1 %2) local_unnamed_addr #0 {
 %.not = xor i1 %2, true
  %4 = select i1 %2, i1 %1, i1 false
  %brmerge3 = or i1 %4, %.not
  br i1 %brmerge3, label %common.ret, label %5

common.ret:
  ret i32 0

5:
  store i1 %1, ptr %0, align 4
  br label %common.ret
}
```

expected:
```llvm
define noundef i32 @src(ptr writeonly captures(none) %0, i1 %1, i1 %2) local_unnamed_addr #0 {
  %.not = xor i1 %2, true
  %4 = select i1 %2, i1 %1, i1 false
  %brmerge3 = or i1 %4, %.not
  br i1 %brmerge3, label %common.ret, label %5

common.ret:
 ret i32 0

5:
  store i1 false, ptr %0, align 4
  br label %common.ret
}
```
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzclUGr2zgQxz-NfBlekGU7sQ8-pH1kKW1fD4U97OUhS2NbW1kK0vilr59-kZO08W5LW9iFpRDISJ7_zEg_wV_GaAaH2LLqBavuMznT6EP726uHh7tX0zHrvH5uR6JjZMWeiQMTh8Hrzlva-DAwcfjExOF19XrbN01eM75f50prnlBsrH2aLvkKL6L3Rv2hA-N7xvcHH4BGhN5b60_GDaC8RiZeAo3Bz8MIyjsK3kJv_SntGwIlHXQIGvWsUAONkoCJKgcTQdqTfI7QSxsRjIPOevUhfd0mcTcTvHnz-1vopbERyIPFJwxyQKDRJJmitOuPZCbzCYFteSQfEEy-tEhFjhRSzFMsrRkclGzLz-dJwfJLB2d8r7E3DsH52WnswRQCWMn3nXp8oA_vghrf75mobyveNDqHgokGrFfSPs7OyQn1o9Q6ANu9YHwP0IUviS_Byg5tWpWrVXUer0x8VqJ8lab8NHm3CUhfU1f_UK9bbr9Va1HfrC9lAtJyI5e72173f-jGL3N8o93u_hbGub4_Ety9K85dfgxUDOqC5xQMoXf2GZQ80hwwMlE77zDR-Xl2ouBXgExUG-cJWHEPH_3qZinMuBw08VwSIlpUdJuz7rm8-6ukCxOGAYtF-bny8jAuTdc0r_k_8SS-C7X6j6HixyMqQv1_o_qLYf0u1fOE_xLWa5zpttBN0cgM23xX7kRTF1Wdja2se1WJqtyWsih2vNt1O1nmomiaQvOmVJlpBRcVr_KK10WT15uuEGJX60ZXed7LrWAlx0ka-9mhMhPjjG1eci6qbBk1Lt4ohMMTLF-ZEMkqQ5tEd908RFZyayLFL2XIkMX2rYkRdTKvSNJR8jed3O1rrpbNwf7daQ2Nc7dRfmLisLzl89_dMfg_URETh2WgyMThMvFTK_4KAAD__yAGQVU">