[Bug target/54904] New: Large mode constant live in a register not used to optimize smaller mode constants
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Oct 11 19:53:00 GMT 2012
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54904
Bug #: 54904
Summary: Large mode constant live in a register not used to
optimize smaller mode constants
Classification: Unclassified
Product: gcc
Version: 4.7.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: jakub@gcc.gnu.org
CC: uros@gcc.gnu.org
void
foo (char *p)
{
__builtin_memset (p, 0x11, 23);
}
results in terrible code on x86_64-linux at -O2:
movabsq $1229782938247303441, %rax
movl $286331153, 16(%rdi)
movb $17, 22(%rdi)
movq %rax, (%rdi)
movq %rax, 8(%rdi)
movl $4369, %eax
movw %ax, 20(%rdi)
ret
E.g.
movabsq $1229782938247303441, %rax
movl %eax, 16(%rdi)
movb %al, 22(%rdi)
movq %rax, (%rdi)
movq %rax, 8(%rdi)
movw %ax, 20(%rdi)
ret
would be 10 bytes shorter. Guess we don't want to do this kind of
optimizations before RA, it might increase register preassure, but somewhere
close to final would be nice. Use a register instead of immediate if it is
available, makes the insn smaller and not slower.
More information about the Gcc-bugs
mailing list