<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/62696>62696</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Missed combination of addition carry flag and conditional jump
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:X86,
llvm:codegen,
missed-optimization
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
chfast
</td>
</tr>
</table>
<pre>
If we have a conditional branch on overflow/carry flag and this condition is merged with some other conditional branch with `or i1` then the codegen is not able to use the carry flag in the branch instruction directly (it will use temporary register to store the carry with `setcc`).
```c
void bad(unsigned x, unsigned y, unsigned z, unsigned* sink)
{
unsigned s = y + z;
_Bool ov = s < y;
if (x || ov)
return;
*sink = s;
}
void good(unsigned x, unsigned y, unsigned z, unsigned* sink)
{
if (x)
return;
unsigned s = y + z;
_Bool ov = s < y;
if (ov)
return;
*sink = s;
}
```
```llvm
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
define dso_local void @bad(i32 noundef %0, i32 noundef %1, i32 noundef %2, ptr nocapture noundef writeonly %3) local_unnamed_addr #0 {
%5 = add i32 %2, %1
%6 = icmp ne i32 %0, 0
%7 = icmp ult i32 %5, %1
%8 = or i1 %6, %7
br i1 %8, label %10, label %9
9: ; preds = %4
store i32 %5, ptr %3, align 4
br label %10
10: ; preds = %4, %9
ret void
}
define dso_local void @good(i32 noundef %0, i32 noundef %1, i32 noundef %2, ptr nocapture noundef writeonly %3) local_unnamed_addr #0 {
%5 = icmp eq i32 %0, 0
br i1 %5, label %6, label %10
6: ; preds = %4
%7 = add i32 %2, %1
%8 = icmp ult i32 %7, %1
br i1 %8, label %10, label %9
9: ; preds = %6
store i32 %7, ptr %3, align 4
br label %10
10: ; preds = %9, %6, %4
ret void
}
attributes #0 = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
```
```asm
bad: # @bad
add esi, edx
setb al
test edi, edi
jne .LBB0_3
test al, al
jne .LBB0_3
mov dword ptr [rcx], esi
.LBB0_3:
ret
good: # @good
test edi, edi
je .LBB1_1
.LBB1_3:
ret
.LBB1_1:
add edx, esi
jb .LBB1_3
mov dword ptr [rcx], edx
ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMV8mO4zgS_Rr6QihBUasPPthpJDDAzGkuczMoMSSzUiI1JOUlv75BarGU5ayqblQDbRgSqXixMOJxY8aIWgLsUHJAyXHDentWeleeK2bsplD8vvtXha-Az-wCmOFSSS6sUJI1uNBMlmesJFYX0FWjroi-lUzrO64aVmMmObZnYR5KWBjcgq6B46uwZ2xUC1jZM-hnhj0EpURpLEKUEmzPIN0Dl4pDDd6cVBazogFsFe4NDOJHDGJQGC0KaazuSx8KFxpK29wxormw-CqaZjAAbac003esoRbGgnamjVV6aXyKzYAtS5QSRLcviBwR2Y_PlAz_cuhflOC4YBzRvJc-5RzfEH3Fc---6n0se4jusRHyHdHtaD07DA2M8UPHYBQdsRvQAX-gaAE5HZRqsLp4gIO94vsMeMBE5ZJxwyh7RdkrVhdEt3gUa7C9liurixbdu_gG8w_D2XHpwaegVurvyMEY-SzE4-9T1KPwd2fMJ-p35GkizVMmNc2lHT5ZpmuwmDPLGnZXvfUGEaUQtCjaQ9DRjKBoH1H_cN1w3XWtNPaPQEyNKndKIc0DmbtGOumkcfDfkOaI0pV_q0XXwOT7lqenNA56-S7VVQaNkP0tqGU_aw1PDpWQgLlRp0aVrMGeFigmw-QQEcVS9ZKDy2xCHAU-fQuffKPuW2c1lqpkne01zNKrFhaU9BM9iRyjvd9TLyVrgZ8Y5xojGhG8YBSiSeIHxjj3viYf3v8DlHqQKNsOS5iAPmiyQGUPVN_YCZY8sZd7pF_wvPkRkk2QYpLkTtKwAhpvgqy622XCtyjaYxQdcKeBm7FaSTxZHBa2ZUgujUOqXjFrRC1xvHC_9LnwEpIv3AwDmKelBusr_nSF-JIb46rxTyOHryj8_3nd51Ilq9qknwu3GH_641LNTPoJKfOndMs-I_8ql_7k77vxpGMAK-Zlv5t523G40xSKf4mBzFotit6CGavujGUH3PbGdlrVGow7clQaHIc0lL02rmXusvSkugrJ_Vli2AdwC63Sd0RzpusW3Oo8cM5Rrb9af3JBlLZCBg3UrAkuUFqlg6vg9uyWzuiIKCWIuixRqQKrWdcJWQctWwCs7mHEGMvK96DTyg6Wir6qQAdGfMAMz0fssJAHZdfPolueBmm8llfA3KwxMwjRQ3lztEH0UN2MHlptexsaxsDcoEPrlmeTzV7CymMNErQovfjXdkJmxo3Q7Rmu-DSadpDV7u_mifuBEY4FwG9ruQFbeFwzfrdgrFfgo4JYK3yT4N8v_z4cyClaCydl1gz8HaU_1GnVxb_5VWk-8D856PKGkqMPwIwBTMrR_nHMGFp-afylWTlmySt8H_iXQx6i9-GHp_ARTvg0nAkW7b8oBb-tBja7KZZupiz9LD2fCzqHMVNlw3cR30ZbtoFdmOYxIXGYks15xwuS5UUS5yRKS0KSLatIlkEc5UVIopBuxI4SGpEkjMI8SQl5qaDMqhgymiQQxhChmEDLRPPiDmYvStcbYUwPu5Sm23TjVyvjr1WUFqx8B-nq9L889fPnFVHqD3TRfrzMzJ9bYQzwQHVWtOKDucuKkyXHjd45laDoa4Ni0ghjzcO5FbaB3X-8Mi5VWwjpdbGqXPaH-9en29ny0vWtb7tNr5vd2drOuALSN0TfamHPffFSqhbRNx_x8HIrzDcoLaJvftgG0Tc_8j8CAAD__2-97fg">