This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug rtl-optimization/83133] New: Superflous x86 test instructions in generated assembly.
- From: "maxim.yegorushkin at gmail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Thu, 23 Nov 2017 16:45:44 +0000
- Subject: [Bug rtl-optimization/83133] New: Superflous x86 test instructions in generated assembly.
- Auto-submitted: auto-generated
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