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

    <tr>
        <th>Summary</th>
        <td>
            [SimplifyCFG] Convert conditional branch into unconditional branch if the incoming values of phi node can be represented by the condition
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            missed-optimization,
            llvm:transforms
      </td>
    </tr>

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

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

<pre>
    Alive2: https://alive2.llvm.org/ce/z/K8WVKU
```
define i1 @src1(i32 noundef %0, i32 noundef %1) {
start:
  %2 = icmp eq i32 %0, 0
  br i1 %2, label %bb6, label %bb5

bb6:
  %3 = icmp eq i32 %1, 0
  br i1 %3, label %bb2, label %bb3

bb5:
  %.not = icmp ult i32 %0, %1
  br i1 %.not, label %bb3, label %bb2

bb2:
  br label %bb3

bb3:
  %_0.sroa.0.0 = phi i1 [ true, %bb2 ], [ false, %bb6 ], [ false, %bb5 ]
  ret i1 %_0.sroa.0.0
}

define i1 @tgt1(i32 %0, i32 %1) {
start:
  %2 = icmp eq i32 %0, 0
  %3 = icmp eq i32 %1, 0
  %.not = icmp uge i32 %0, %1
  %cond = select i1 %2, i1 %3, i1 %.not
  ret i1 %cond
}
```
We can convert conditional branches into unconditional branches and adjust incoming values of the phi node:
```
define i1 @src2(i32 noundef %0, i32 noundef %1) {
start:
  %2 = icmp eq i32 %0, 0
  br i1 %2, label %bb6, label %bb5

bb6:
  %3 = icmp eq i32 %1, 0
  br i1 %3, label %bb2, label %bb3

bb5:
  %.not = icmp ult i32 %0, %1
  br i1 %.not, label %bb3, label %bb2

bb2:
  br label %bb3

bb3:
  %_0.sroa.0.0 = phi i1 [ true, %bb2 ], [ false, %bb6 ], [ false, %bb5 ]
  ret i1 %_0.sroa.0.0
}


define i1 @tgt2(i32 noundef %0, i32 noundef %1) {
start:
  %2 = icmp eq i32 %0, 0
  br i1 %2, label %bb6, label %bb5

bb6:
  %3 = icmp eq i32 %1, 0
  br i1 %3, label %bb2, label %bb3

bb5:
  %.not = icmp uge i32 %0, %1
  br label %bb3

bb2:
  br label %bb3

bb3:
  %_0.sroa.0.0 = phi i1 [ true, %bb2 ], [ false, %bb6 ], [ %.not, %bb5 ]
  ret i1 %_0.sroa.0.0
}
```
Finally we will get a select instruction with `foldTwoEntryPHINode`.

Inspired by https://github.com/llvm/llvm-project/pull/120177: https://rust.godbolt.org/z/cEjsW56Pq

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsVs2OozgQfhrnYg0yRSDhwIHuDLujkVYj7U8fV8YUiVvGZmyTbPrpVyakQ6fTq2ntYS4tISG77PrK9ftx5-RWIxYkvSMAjRf_PB0PBICkmwUf_M7YYtpc1KY5FqWSewSSlHTnfe9IUhKoCFR83I-U2neRsVsClUAC1ROB6uv64a-vfxJWkoxNHysbbKVGKmNKlsxZERNYywSoNoNusKUEUkbgnl7txQRySlZ3hJXOc-sDPitpEAElyYZK0fUUv4_3zjrYeKS2IxqkEPYUr1GFVV1nV-s0mMrKILhoT25pj29oT660XaMlZ-3pTHukjb8ADMq_sH9EegESzr_Se4074cAZp7Y37UhmdvzNImcNj1jERnP6nRwR0zvq7YCTMXUNlKSbcZXe0ZYrdxFlb4vSURSgLPrpJTPEYNBqczLrRXr4rT-nxzwt_l86_EBMXwdmi7cDQyAVRjfjSYcKhZ_n2iwxZuF76Ydw_eKAWaE8IBVcU2H0Hq0P_0Z6aTRXtLZcix06KrU3dNA3ZVw3lDePg_NUamE6qbd0z9WAjpqW-h2OQdamwZPz_qtI4aNIP4r0UqQ36vQjQ36gW7wR45-ZA7N0fV8WzLpFJTVX6kgPSA9SKbpFT_lzO9TO20GE7kQP0u8oyVhrVPPHwXzW3h6__frlt9CDMhad3vtFu15abGh9vKIaW-l3Qx0J0xGoAuGYfp96ax5ReAJVPyhFoIqBxavVa7JiB-ejrWlqo_zEVgJREZ8f3UOafftOWLloiqTJk5wvsIhXyTLN8yyHxa7IuFiusUbB1ykyxuMkznjdtBm0MfKELWQBDJYxxDnL42UKkcCWs5ax9Yq3dSJysmTYcameydJCOjdgEQNLk3wxht5NhKyTzmHzyfRedvKJB_cFcgb3BGB8elJ6y7Vrje3cRNtsMXqjHraOLJmSzrsLlJdejWzvd9n1SrbH--oXkm7o_Zvz5e3pQuVpgNyYK-eZMs6uGqnF3qJD7U8BDbee9S0Gq4p3h3j0mTsFObhtX8C_AQAA__9Puf_R">