[Bug rtl-optimization/63548] New: redundent reload in loop after removing regmove
wmi at google dot com
gcc-bugzilla@gcc.gnu.org
Wed Oct 15 22:08:00 GMT 2014
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63548
Bug ID: 63548
Summary: redundent reload in loop after removing regmove
Product: gcc
Version: 5.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: wmi at google dot com
Created attachment 33730
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=33730&action=edit
testcase 1.c
For program with many insns like "a = b + c", where operands "b" and "c" are
both dead immediately after the add insn, the hardreg preference heuristic
seems not perfect.
Here is a testcase 1.c,
For gcc after r204212, they generates two redundent reload insns caused by
imperfect hardreg preference heuristic in IRA.
~/workarea/gcc-r214579/build/install/bin/gcc -O2 -S 1.c
.L5:
movl %ebx, %edi
call goo
leal 2(%rbx), %edi
movl %eax, %r13d
call goo
leal 4(%rbx), %edi
movl %eax, %r12d
call goo
leal 6(%rbx), %edi
movl %eax, %ebp
addl $1, %ebx
call goo
movl %eax, %edx // redundent mov
movl %r13d, %eax // redundent mov
imull %r12d, %eax
imull %ebp, %eax
imull %edx, %eax
addl %eax, total(%rip)
cmpl %ebx, M(%rip)
jg .L5
For old gcc with regmove, it happens to be better than hardreg preference
heuristic and generates one redundent reload.
~/workarea/gcc-r199418/build/install/bin/gcc -O2 -S 1.c
.L3:
movl %ebx, %edi
call goo
leal 2(%rbx), %edi
movl %eax, %r13d
call goo
leal 4(%rbx), %edi
movl %eax, %r12d
call goo
leal 6(%rbx), %edi
movl %eax, %ebp
addl $1, %ebx
call goo
movl %r13d, %edx // redundent mov
imull %r12d, %edx
imull %ebp, %edx
imull %eax, %edx
addl %edx, total(%rip)
cmpl %ebx, M(%rip)
jg .L3
llvm generates no redundent move insn.
clang-r217862 -O2 -S 1.c
.LBB0_2:
movl %ebx, %edi
callq goo
movl %eax, %r14d
leal 2(%rbx), %edi
callq goo
movl %eax, %ebp
leal 4(%rbx), %edi
callq goo
movl %eax, %r15d
leal 6(%rbx), %edi
callq goo
imull %r14d, %ebp
imull %r15d, %ebp
imull %eax, %ebp
addl %ebp, total(%rip)
incl %ebx
cmpl M(%rip), %ebx
jl .LBB0_2
More information about the Gcc-bugs
mailing list