<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">