[Bug rtl-optimization/83133] New: Superflous x86 test instructions in generated assembly.
maxim.yegorushkin at gmail dot com
gcc-bugzilla@gcc.gnu.org
Thu Nov 23 16:45:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83133
Bug ID: 83133
Summary: Superflous x86 test instructions in generated
assembly.
Product: gcc
Version: 7.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: maxim.yegorushkin at gmail dot com
Target Milestone: ---
Consider the following code:
int negative(int);
int positive(int);
int nonnegative(int);
int nonpositive(int);
int f(int a, int b) {
int diff = a - b;
if(diff < 0)
return negative(diff);
else
return nonnegative(diff);
}
int g(int a, int b) {
int diff = a - b;
if(diff > 0)
return positive(diff);
else
return nonpositive(diff);
}
And the assembly generated with `-O3 -march=broadwell`:
f(int, int):
subl %esi, %edi
js .L4
jmp nonnegative(int)
.L4:
jmp negative(int)
g(int, int):
subl %esi, %edi
testl %edi, %edi <---- unnecessary instruction.
jle .L6
jmp positive(int)
.L6:
jmp nonpositive(int)
g function assembly contains a superflous test instruction. It should not
generate that instruction, since sub instruction already sets all the required
flags. I first discovered this issue in gcc-4.9.2 and it is still there in
gcc-7.2.0.
Double-checked it with clang-5.0.0 and it seem to generate optimal assembly:
f(int, int): # @f(int, int)
subl %esi, %edi
js .LBB0_1
jmp nonnegative(int) # TAILCALL
.LBB0_1:
jmp negative(int) # TAILCALL
g(int, int): # @g(int, int)
subl %esi, %edi
jle .LBB1_2
jmp positive(int) # TAILCALL
.LBB1_2:
jmp nonpositive(int) # TAILCALL
More information about the Gcc-bugs
mailing list