[Bug rtl-optimization/70703] [6/7 regression] Regression in register usage on x86
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Mar 31 10:16:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70703
--- Comment #10 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Created attachment 41094
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=41094&action=edit
gcc7-pr70703-widen.patch
The widening_mult change. We get tiny bit better code with it with the #c0
testcase:
- movl $6700417, %ecx
- movl %ecx, %eax
+ movl $6700417, %edx
+ movl %edx, %eax
mull 4(%esp)
- movl %edx, %ecx
- movl %ecx, %eax
+ movl %edx, %eax
but still not ideal. On the other side, we regress on -m64:
unsigned long
foo (unsigned long x)
{
return ((__uint128_t) x * 0x663d811234567ULL) >> 64;
}
- movabsq $1798629511873895, %rax
- mulq %rdi
+ movq %rdi, %rax
+ movabsq $1798629511873895, %rdx
+ mulq %rdx
Another option is to deal with this at combine time, I see on the unpatched
compiler:
Failed to match this instruction:
(set (reg:SI 95)
(subreg:SI (mult:DI (zero_extend:DI (mem/c:SI (reg/f:SI 16 argp) [1 x+0 S4
A32]))
(const_int 6700417 [0x663d81])) 4))
Maybe we could add some define_insn_and_split that would deal with this and
make sure the constant is forced into a register (if the constant has depending
on <s> all upper bits zero or set) and transform it into the highpart insns?
Though, I'm worried about the regression above we got with the TImode highpart.
More information about the Gcc-bugs
mailing list