<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/142242>142242</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Empty basic blocks with unconditional branches aren't eliminated
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
ashivaram23
</td>
</tr>
</table>
<pre>
The following function calculates `a && b`:
```llvm
define i1 @a_and_b(i1 %a) {
start:
br i1 %a, label %a_is_true, label %a_or_b_is_false
a_is_true:
%b = call i1 @get_b()
br i1 %b, label %end, label %a_or_b_is_false
a_or_b_is_false:
br label %end
end:
%retval = phi i1 [ true, %a_is_true ], [ false, %a_or_b_is_false ]
ret i1 %retval
}
declare i1 @get_b()
```
No `-O3` pass is able to remove the `a_or_b_is_false` block, resulting in more assembly instructions than needed:
```nasm
_a_and_b:
push rbx
test dil, 1
je LBB0_2
mov bl, 1
call _get_b
test al, 1
jne LBB0_3
LBB0_2:
xor ebx, ebx
LBB0_3:
mov eax, ebx
pop rbx
ret
```
Instead, the function should become something like
```llvm
define i1 @a_and_b(i1 %a) {
start:
br i1 %a, label %a_is_true, label %end
a_is_true:
%b = tail call i1 @get_b()
br label %end
end:
%retval = phi i1 [ false, %start ], [ %b, %a_is_true ]
ret i1 %retval
}
```
and generate x86 instructions like this:
```nasm
_a_and_b:
test dil, 1
jne _get_b
xor eax, eax
ret
```
That should mostly happen in SimplifyCFGPass. I think the fix could be as simple as removing the check for `BB->phis().empty()` in `CanRedirectPredsOfEmptyBBToSucc` in Transforms/Utils/Local.cpp. A comment there says "There must be phis in BB, otherwise BB will be merged into Succ directly," but that's not always true.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzEVU-P4rgT_TTmUmoUHBLgkEOne_hppNFvRju9Z1R2CuJpx45sB5pvv7ITaJh_Gu1lJSRw_FzvVfk9gt6rgyGqWFGz4nmGQ2itq9C36ogOO57PhG3O1UtLsLda25MyB9gPRgZlDUjUctAYyAMrMwTGS8ZLEKzMWP7IsvQps_Gj9bFj2WNDe2UI1ALYMsMdmmYnGF_HNS-Q8Q2wVc2yRx_QhbEKgHBwBTyBRkE6rXbK74Ib6Lun1u1E3Nqj9jTKeIdOJRkvBLD8OTahJzkHCkkM45uIubKKu_pkmj_hu3_43shdnYSNP95VOQpH1Ela36qkoKjh0uVt18CK5_SsqGFkuQDuuBMsFncUpoZGjsi-eh41NCQ1OvrpIK5XOEL_b-NtP3zOWZlBj96D8oBCEwQLjjp7JAgtJUt8N4UyA6GtfI1CHflBh-gnZaCzjgC9p07oMyjjgxuSxzyEFg0YooaaH01l0EdT7S5GmsbYD74FJ97SIpAP0CgdSRfpyTeCT3Wd7XhadfYI4mY3GWI3juB6Hm-Pm-l8zrLHqdBE_GYdkHiLWEr0E27ajlSEN9sAve0vSh2FH6f90fhAmBwXh3rNnm_toBsQJG1H4G1HoY3D1OqV_qvkXR3967QFVPo3kfv3AbkNQOrgNh2XDP-Qnt_H4v4m0DRwIEMOA8Hbury3aZw7hFb5PzbpT3xp6NZ4yUyTW_DXDnlpMVzs0Fkf9Bla7HsyMVhfVddrtT8_bf_3Bb2fw8co0ryOZlJvICcbAXrwEZx-pRhHO0WYbEm-wt66GOm6fmD5hz42mm5tTl0fztMNllnkZGX2hOYvapQjGb44avzn_YcIq-sX-3WQcgK-ODR-b13nGd_-HZSO35-sRD2XfT-HR5C268iEKMMReDx7YJy_pFU3-BCFRy2xWl3HSdkIPSlPUNdwUlpHSEfuQA0oEyxEfhil6TPjT4xzEEOkwMD4yoOxMe6nyBV9Mp81Vd5s8g3OqFqslutyucmX2ayt9o1cLUhsxGqxWZHEPSe5Wu9XJa4pK9fZTFU840VW5BnPi2KZzZdLLpocsVg3zWZBOVtm1KHS8xjRuXWHmfJ-oGqx5HzJZykJPr2cOTd0grTLOI_valfFQw9iOHi2zLTywb-XCSpoqtLMQaBXcvzf9XBSoYXBSGsaFY2LGoRDI1vygI4M46sApFWnDAZqZoPTVRtCn2zNt4xvDyq0g5hL2zG-TX8t49dD7-w3koHxbZIZ73Lq41jxfwIAAP__wNCPuw">