<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/98799>98799</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[SimplifyCFG] SimplifyCFG does not eliminate the UB branch after inlining
</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>
DianQK
</td>
</tr>
</table>
<pre>
I tried the following IR:
```
define internal ptr @bar(ptr %arg, i1 %arg1) {
bb:
br i1 %arg1, label %bb4, label %bb2
bb2:
%i = load ptr, ptr %arg, align 8
%i3 = getelementptr inbounds i8, ptr %i, i64 1
store ptr %i3, ptr %arg, align 8
br label %bb4
bb4:
%i5 = phi ptr [ %i, %bb2 ], [ null, %bb ]
ret ptr %i5
}
define i32 @foo(ptr %arg, i1 %arg1) {
bb:
%i = call ptr @bar(ptr %arg, i1 %arg1)
%i2 = icmp ne ptr %i, null
call void @llvm.assume(i1 %i2)
%i3 = load i32, ptr %i, align 4
ret i32 %i3
}
declare void @llvm.assume(i1)
```
We can eliminate the branch, but it doesn't. To my surprise, re-executing the output once simplifycfg eliminates this branch: https://llvm.godbolt.org/z/85zKbMdxe.
I've noticed that the user order is different after inlining and reading the text IR.
The `passingValueIsAlwaysUndefined` only considers the first user:
https://github.com/llvm/llvm-project/blob/92f4001906a18fca29929a333e61fdd662a9b0bd/llvm/lib/Transforms/Utils/SimplifyCFG.cpp#L7567-L7577
Of course there are many ways to solve this problem, for example:
1. Handle all users
2. Choose an instruction that `passingValueIsAlwaysUndefined` can handle (I'd go with this one first.)
3. Support `assume(%p == null)`
But my biggest concern here is **whether the user order needs to be consistent**. I don't like it when an optimization happens randomly.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVl2PqzYT_jXOzWgRmK9wkYvNRnnf6Jyq6vlor208gFtjI9vsbvbXVzbZLIla9bRSBBrMzDwz8zxDmHOy14g7Uu5Jediw2Q_G7g6S6V8-bbgR590JvJUowA8InVHKvEjdw-kLyR9JeiDp-7VKL79oCuykRpDao9VMweQtkCLlzBK6jQYtme0JfQKZXYyM0AZIvV8icH7NAMDtzWtPoBhHFR5wXtzZdA0rmB9hCC0lkPwAyjARMAXXWzRMyV7Ddu2RR5cePSocUfvgIDU3sxYO5HYVQ8Z6qgKyd3_njcXrcf6P-bi9Le2mlOKulDICmwa5xCz3VwxLI4CUh2iVe9CzUteTeHAJZNFf8ZWXfPVhnfh9ljkNI-yM-U8jvPa-ZerH-bD2ptFdtuMEGm9aHou7vBnDPxspQnylnseEOTePSOh2iSzpXdz8gxIyp_fjXAZUrNsVOxHH-dftahWz-LcYrtnvJLNcf0NomQZUcpSaeYy645bpdgho-OxBehAGnSa09gl8MzCewc12stJheMfiA75iO_sg1OBuZj_NHoxuEZwcJyW7c9v1H0kc-EG69zT5IwzeTy4Mjx4JPcYKeiO4UT4xYUrHN0KP2_LtE_9JvGKyLuBEaP2MoI2XbVwbzEcQs0MLxgq0IB0I2XVoUXtgnQ-PtJI64GVagEUm3rF7fPVw-nKT4tuAQKp0CttL978yNePJPaoXdnbf9cJWQaoUjFZnaI12UqB1ywaT1vmI5UrN21p76YeZJ60ZL4Vfbg-TNb9j6wk9cmU4oceGdkWaZk1asWzbtYw2DW1YnudYZZ0QVUVZw1MuVnFk8PtmmXadsaMj9PjdSxXuXy9jeTr-L2mnidD8c11W9cPnuqzrde0_d9Ca2bpIDIsQmDYyfYZQPXgDzqhnXOY5WcMVjoETnbGAr2ycFN4t7iyB_zMtFEIQTuiMWw5oAk-DMQ6BaZDaeTu3Xhq9jPRH-h-IPCyxCd0GYgjoDbxIPywAjb5MJLmKIk_g6zxNxsYUV9kQWk5BpkGpyypr7oSzn30QApd9j86HsbdoNcQmSQeEPhL6-DJgaNs9ITWiiM3juPDFedR-cUngBMJEsYGSf2CQ38uAOnTFTF6O8o3FtgxsmlA7sEwLM6pzshG7XDR5wza4y2qaNkVJm3Qz7GhLmyor85ZWedZts4yVdFvwhpdFW3VVuZE7mtIirbMi3dIsT5O6bVmZl6XIWkbzoiNFiiOTKonSNLbfSOdm3DXbumk28Qvi4jed0si9_HEN1REa1hyhdJTOoXhYH4az8rCxu8h6Pvcu7DDpvPtI5qVX8T_DirakPMDKjCsqbIG7VfZ9f1kzd8LfzFbt_rUUY9VBP0vhzzv6ZwAAAP__aUitbg">