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

    <tr>
        <th>Summary</th>
        <td>
            [SimplifyCFG] Failure to sink if one branch simplifies
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            missed-optimization,
            llvm:transforms
      </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/7GaUcf

```llvm
define ptr @src(ptr %p, i64 %x) {
entry:
  switch i64 %x, label %unreachable [
 i64 0, label %exit
    i64 1, label %bb1
    i64 2, label %bb2
 ]

bb1:
  %gep1 = getelementptr inbounds nuw i8, ptr %p, i64 4
  br label %exit

bb2:
  %gep2 = getelementptr inbounds nuw i8, ptr %p, i64 8
  br label %exit

unreachable:
  unreachable

exit:
  %phi = phi ptr [ %gep1, %bb1 ], [ %gep2, %bb2 ], [ %p, %entry ]
  ret ptr %phi
}

define ptr @tgt(ptr %p, i64 %x) {
entry:
  switch i64 %x, label %unreachable [
 i64 0, label %exit
    i64 1, label %bb1
    i64 2, label %bb2
 ]

bb1:
  br label %exit

bb2:
  br label %exit

unreachable:
 unreachable

exit:
  %phi = phi i64 [ 4, %bb1 ], [ 8, %bb2 ], [ 0, %entry ]
  %gep = getelementptr inbounds nuw i8, ptr %p, i64 %phi
  ret ptr %gep
}
```

We can sink this if we treat the default branch as a `getelementptr inbounds nuw i8, ptr %p, i64 0` and subsequently fold the switch to arithmetic. Not sure how profitable this would be in general, but it's certainly profitable if it allows us to fold away the switch.

This is kind of similar to the copyable element problem in SLP.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzcVU1v4zYQ_TXUZbAGRUn-OOjgJNBeiqLAtuiZpEbWNBSpklS83l9fkHYcOw3a7h4LCJDlN-J7897YI0Ogg0VsWfPAmqdCLnF0vrX0TLpQrj-1Y4xzYNWeiY6JThp6QbEy5mVaOX9gotPIRPeNiW7zWf6mB8b36Vrz85UKGd_3OJBFmKMHVvPgNRPb_CCamYlHoHWdPn9lYgds88D4Hm30p0TL9wDhSFGPN1WPYKRCk54W61HqUSqDkJrg-1zH74rwK8V8EmSwvAOVKm8w8Q4TCWPN07mxVHsRxURzwLkEVj3BASManNDG1BVZ5RbbB7DLEWibDnzfbJ2PUP5vEjOHuOcQP8ax_QeOG9deuW6_yjW5-k3IPFLWke6Zqnl49SAxno3MTqWnKyiuoHgHzhckR32xGMBjvHYyUlKyuXh_P0TxEP8HQ_SvE_Bf4_ue9LIFzQPUH-e2_Tgx_mFc55B_bECvEd-lfsD5LfXX_5FzT78jaGkhkH2GOFIAGuCIED3KCHFE6HGQi4mgvLR6BBlAAlvz71aWKEHaHsKiAv65oI3mBIMzfaa5jFJ0ID3FccJIegU_uwhh8QijO8Ls3UAxD1RWenSL6UEhkIUDWvTSJDK1RKDIxCaARh8lWXO6fZcGoAjSGHcMsIREmVXIozzdSFmd_fk1exLgmWwPboBAExnp01upVrv5lE-9mJGIlMEpafry0y-rom-rflftZIFtuakqsRac74qxlbWWarNWul-XervZNapX_VCV9a4cdtuhKagVXNSl4JUoa853K4Va9M22atZcK133rOY4STLXzVFQCAu2Zblt6m2RRzzkJSTERCFg_8nNkSb6JiM5y0T6RTEh8j6p9tFLGwbnp5CQ5qnwbUI-qeUQWM0NhRjeqCJFkzfcF5pmQ8PpsfvMmifoJJmUV3TnkaIBnMXX4QnnYsJQLN6824MHiuOiVtpNTHRZ1Pn2afbuD9SRiS43GJjoLj2-tOKvAAAA__8s-jkb">