This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug rtl-optimization/17236] inefficient code for long long multiply on x86
- From: "ubizjak at gmail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 18 Dec 2007 18:33:22 -0000
- Subject: [Bug rtl-optimization/17236] inefficient code for long long multiply on x86
- References: <bug-17236-1008@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #16 from ubizjak at gmail dot com 2007-12-18 18:33 -------
(In reply to comment #15)
> Note two moves [(insn 36) and (insn 37)] around (insn 12).
Bah. This is the correct sequence, around (insn 10) that seems to be the root
of all problems:
(insn:HI 9 8 36 2 m.c:2 (parallel [
(set (reg:SI 2 cx [62])
(plus:SI (reg:SI 2 cx [62])
(reg:SI 0 ax [63])))
(clobber (reg:CC 17 flags))
]) 249 {*addsi_1} (nil))
(insn 36 9 10 2 m.c:2 (set (reg:SI 0 ax)
(reg:SI 4 si [orig:66 b ] [66])) 47 {*movsi_1} (nil))
(insn:HI 10 36 37 2 m.c:2 (parallel [
(set (reg:DI 0 ax)
(mult:DI (zero_extend:DI (reg:SI 0 ax))
(zero_extend:DI (reg:SI 3 bx [orig:64 a ] [64]))))
(clobber (reg:CC 17 flags))
]) 304 {*umulsidi3_insn} (nil))
(insn 37 10 11 2 m.c:2 (set (reg:DI 3 bx [61])
(reg:DI 0 ax)) 88 {*movdi_2} (nil))
DImode AX as found in (insn 10) could simply be propagated up and down RTL
stream as SImode destination of (insn 8) and SImode source of (insn 12). For
some reason, RA is afraid to allocate registers in mixed modes.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17236