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