<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/120539>120539</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[SimplifyCFG] Convert conditional branch into unconditional branch if the incoming values of phi node can be represented by the condition
</td>
</tr>
<tr>
<th>Labels</th>
<td>
missed-optimization,
llvm:transforms
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
dtcxzyw
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
dtcxzyw
</td>
</tr>
</table>
<pre>
Alive2: https://alive2.llvm.org/ce/z/K8WVKU
```
define i1 @src1(i32 noundef %0, i32 noundef %1) {
start:
%2 = icmp eq i32 %0, 0
br i1 %2, label %bb6, label %bb5
bb6:
%3 = icmp eq i32 %1, 0
br i1 %3, label %bb2, label %bb3
bb5:
%.not = icmp ult i32 %0, %1
br i1 %.not, label %bb3, label %bb2
bb2:
br label %bb3
bb3:
%_0.sroa.0.0 = phi i1 [ true, %bb2 ], [ false, %bb6 ], [ false, %bb5 ]
ret i1 %_0.sroa.0.0
}
define i1 @tgt1(i32 %0, i32 %1) {
start:
%2 = icmp eq i32 %0, 0
%3 = icmp eq i32 %1, 0
%.not = icmp uge i32 %0, %1
%cond = select i1 %2, i1 %3, i1 %.not
ret i1 %cond
}
```
We can convert conditional branches into unconditional branches and adjust incoming values of the phi node:
```
define i1 @src2(i32 noundef %0, i32 noundef %1) {
start:
%2 = icmp eq i32 %0, 0
br i1 %2, label %bb6, label %bb5
bb6:
%3 = icmp eq i32 %1, 0
br i1 %3, label %bb2, label %bb3
bb5:
%.not = icmp ult i32 %0, %1
br i1 %.not, label %bb3, label %bb2
bb2:
br label %bb3
bb3:
%_0.sroa.0.0 = phi i1 [ true, %bb2 ], [ false, %bb6 ], [ false, %bb5 ]
ret i1 %_0.sroa.0.0
}
define i1 @tgt2(i32 noundef %0, i32 noundef %1) {
start:
%2 = icmp eq i32 %0, 0
br i1 %2, label %bb6, label %bb5
bb6:
%3 = icmp eq i32 %1, 0
br i1 %3, label %bb2, label %bb3
bb5:
%.not = icmp uge i32 %0, %1
br label %bb3
bb2:
br label %bb3
bb3:
%_0.sroa.0.0 = phi i1 [ true, %bb2 ], [ false, %bb6 ], [ %.not, %bb5 ]
ret i1 %_0.sroa.0.0
}
```
Finally we will get a select instruction with `foldTwoEntryPHINode`.
Inspired by https://github.com/llvm/llvm-project/pull/120177: https://rust.godbolt.org/z/cEjsW56Pq
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsVs2OozgQfhrnYg0yRSDhwIHuDLujkVYj7U8fV8YUiVvGZmyTbPrpVyakQ6fTq2ntYS4tISG77PrK9ftx5-RWIxYkvSMAjRf_PB0PBICkmwUf_M7YYtpc1KY5FqWSewSSlHTnfe9IUhKoCFR83I-U2neRsVsClUAC1ROB6uv64a-vfxJWkoxNHysbbKVGKmNKlsxZERNYywSoNoNusKUEUkbgnl7txQRySlZ3hJXOc-sDPitpEAElyYZK0fUUv4_3zjrYeKS2IxqkEPYUr1GFVV1nV-s0mMrKILhoT25pj29oT660XaMlZ-3pTHukjb8ADMq_sH9EegESzr_Se4074cAZp7Y37UhmdvzNImcNj1jERnP6nRwR0zvq7YCTMXUNlKSbcZXe0ZYrdxFlb4vSURSgLPrpJTPEYNBqczLrRXr4rT-nxzwt_l86_EBMXwdmi7cDQyAVRjfjSYcKhZ_n2iwxZuF76Ydw_eKAWaE8IBVcU2H0Hq0P_0Z6aTRXtLZcix06KrU3dNA3ZVw3lDePg_NUamE6qbd0z9WAjpqW-h2OQdamwZPz_qtI4aNIP4r0UqQ36vQjQ36gW7wR45-ZA7N0fV8WzLpFJTVX6kgPSA9SKbpFT_lzO9TO20GE7kQP0u8oyVhrVPPHwXzW3h6__frlt9CDMhad3vtFu15abGh9vKIaW-l3Qx0J0xGoAuGYfp96ax5ReAJVPyhFoIqBxavVa7JiB-ejrWlqo_zEVgJREZ8f3UOafftOWLloiqTJk5wvsIhXyTLN8yyHxa7IuFiusUbB1ykyxuMkznjdtBm0MfKELWQBDJYxxDnL42UKkcCWs5ax9Yq3dSJysmTYcameydJCOjdgEQNLk3wxht5NhKyTzmHzyfRedvKJB_cFcgb3BGB8elJ6y7Vrje3cRNtsMXqjHraOLJmSzrsLlJdejWzvd9n1SrbH--oXkm7o_Zvz5e3pQuVpgNyYK-eZMs6uGqnF3qJD7U8BDbee9S0Gq4p3h3j0mTsFObhtX8C_AQAA__9Puf_R">