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

    <tr>
        <th>Summary</th>
        <td>
            [SimplifyCFG] Hoist implied condition
        </td>
    </tr>

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

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

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

<pre>
    https://alive2.llvm.org/ce/z/Dj_5qY
```llvm
define i32 @src(ptr %contents.0, i64 %contents.1) {
start:
  %cmp1 = icmp ugt i64 %contents.1, 7
  br i1 %cmp1, label %if, label %exit

if:
  %load = load i64, ptr %contents.0
  %cmp2 = icmp eq i64 %load, 123
  %cmp3 = icmp eq i64 %contents.1, 16
  %and = and i1 %cmp2, %cmp3
  br i1 %and, label %if2, label %exit

if2:
  ret i32 1

exit:
  ret i32 0
}

define i32 @tgt(ptr %contents.0, i64 %contents.1) {
start:
  %cmp1 = icmp eq i64 %contents.1, 16
  br i1 %cmp1, label %if, label %exit

if:
  %load = load i64, ptr %contents.0
  %cmp2 = icmp eq i64 %load, 123
  %cmp3 = icmp eq i64 %contents.1, 16
  %and = and i1 %cmp2, true
  br i1 %and, label %if2, label %exit

if2:
  ret i32 1

exit:
  ret i32 0
}
```

In this example, `%if2` is taken if `%cmp1`, `%cmp2` and `%cmp3` are all true, otherwise `%exit` is taken. However, `%cmp3` implies `%cmp1`. So we can check `%cmp3` first. This means that the `%if` block is not executed anymore in more cases, so it's only possible if it is side-effect free.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzkVU2P4zYM_TXyhZhApuOPHHzITuBuz9tLT4Vs0zF3bMsrMfOxv76QksxMplP0UvRSIIAS8pF8T0-RjPd8XIhqlX9R-SExJxmtqxd-4C5pbf9SjyKrV9leYaOwMRM_Em6m6XHeWHdU2HSksPmpsDl8_yP_8bvSe1Xo8yeglN73NPBCwBmC2mrvOoXVKg4U5p1dhBbxG63wHrjY3gRThTtQ5Rel916Mk8BC7yFi5jUFlR2Au3mF01E-K76HMuJbB5xeq0J4Mi1NIcDDzU96ZgkC9J6Hd8Mma_o4LH7hYhuK_qrgjRq-UaMfV2ahOBSmmL2DZp9Bb0WkxRVvljOPsL4qwoC5NLuVa5b-g1r8W7l41etIolXpORMxH1JBqioPZ8Ctu3KUf93df9iX_4G74k70n1t7_Refwb8uICN7oGczrxPFM1foy-RCA3sQ80AL8HBJRDsK_YaMagod9b1GshhxBGaazjrxHqyM5J7Y0wUXmb4bsoGv9okeyd00j614Xicmf8thA98sPBF0ZoFupO7hQ9HAzssGfgsCZzKLBxmNgIz0KjLA2sl2D4HEYgXombqTUA9meZmtI-AF4toZTz4Q8xZYFJYe7DK9wGq953aisEMsoY3nnu5oGKgTGBzRJunrrN9lO5NQnZZ5sc3zrCqSsc5zSvu2KlvdVmmvc9xVOBRlMZS63VWlSbhGjbmucKertMBik3bUFX02lH1RYUWD2mqaDU-vV3fC3p-oTvN8VxVJPDg-vgKI8d7O9nYVnvmnEbaLVxgOmEKc2Xvq794nQy4_JK4OhXft6ejVVk_sxb9NE5YpvjLfokPDy33zi8oP8NWyl4trPXR26Tm0TE5u-vD0HFnGU7vp7KywiRTPy93q7HfqRGETJXmFzUXVY41_BgAA___HGwB0">