[Bug rtl-optimization/17104] Non-optimal code generation for bitfield initialization
mmitchel at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Mon Sep 20 01:56:00 GMT 2004
------- Additional Comments From mmitchel at gcc dot gnu dot org 2004-09-20 01:56 -------
In 32-bit mode the initial RTL looks like:
(set:SI (reg:SI 124) (mem:SI (reg:SI 122)))
...
(set:SI (mem:SI (reg:SI 122)) (reg:SI 125))
CSE recognizes that at this point the MEM and REG 125 contain the same value,
and therefore replaces the next read of the MEM with REG 125.
In 64-bit mode, the RTL looks like:
(set:DI (reg:DI 125) (zero_extend:DI (mem:SI (reg:DI 123))))
...
(set:SI (mem:SI (reg:SI 123)) (reg:SI 127))
The zero-extends applied to the load prevent CSE from recognizing that the MEM
written and the MEM read are the same.
There are several possible approaches to consider:
(a) Modify the PowerPC machine description to emit an SImode load,
instead of the zero-extend sequence. (The hardware instruction
actually *is* zero-extending, which is presumably why the
machine description generates the zero-extension.)
(b) Modify the PowerPC machine description to emit the
zero-extension as a separate instruction. (And hope that the
compiler will combine them into one instruction later if
possible.)
(c) Modify CSE to recognize the zero_extend idiom and replace the
operand to the zero_extend.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17104
More information about the Gcc-bugs
mailing list