[Bug target/82858] New: __builtin_add_overflow() generates suboptimal code with unsigned types on x86
lh_mouse at 126 dot com
gcc-bugzilla@gcc.gnu.org
Mon Nov 6 11:35:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82858
Bug ID: 82858
Summary: __builtin_add_overflow() generates suboptimal code
with unsigned types on x86
Product: gcc
Version: 7.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: lh_mouse at 126 dot com
Target Milestone: ---
The following function:
```
unsigned saturated_add(unsigned a, unsigned b){
unsigned c;
if(__builtin_add_overflow(a, b, &c)){
return -1;
}
return c;
}
```
, after being compiled with `gcc -O3 -Wall -Wextra -pedantic -pedantic-errors
-masm=intel`, results in:
```
saturated_add(unsigned int, unsigned int):
add edi, esi
jc .L3
mov eax, edi
ret
.L3:
or eax, -1
ret
```
This is suboptimal, as the branch can be simply eliminated as follows:
```
saturated_add(unsigned int, unsigned int):
add edi, esi
sbb eax, eax // EAX = -1 if CF is set and 0 otherwise.
or eax, edi
ret
```
More information about the Gcc-bugs
mailing list