Constant propagation and CSE
Jeff Law
law@redhat.com
Wed Oct 27 19:26:00 GMT 2010
On 10/27/10 12:15, Frederic Riss wrote:
> Hi Jeff,
>
> On 26 October 2010 16:22, Jeff Law<law@redhat.com> wrote:
>> There is currently no pass which does "un-cse"; however, using insn
>> splitting and operand costing and suitable insn constraints/predicates you
>> can usually arrange to avoid expensive constants in places where it makes
>> sense.
> The thing is the cprop pass doesn't look at insn costs while doing its
> job AFAICS. I'm interested to see how insn splitting can help with
> this if you don't care to explain.
Certainly the SSA propagators don't use costing information; CSE on the
other hand does using costing info, but not always in the way you might
think (addresses in memory references for example are often backwards
from what you might think)
>
> The problem is quite simple: if a target allows big immediates in its
> instructions, the cprop pass can generate quite an inflation in code
> size on some kind of codes. Imagine that a 64-bits constant is
> propagated in every iteration of an unrolled loop. For that case, it
> would be much more cache friendly to have the constant in register(s)
> and not propagate it. Do not focus too much on the 'loop unrolling'
> thing, it's just an example of one kind of code that uses the same
> constant a bunch of times.
This is a common problem. For constants, its generally preferable to
first load them into registers and allow CSE to try and commonize the
large constants. Combine then will propagate single use constants into
their use, leaving the multi-use constants commonized.
Register pressure isn't as much of a problem as you might think because
constants are relatively easy to rematerialize when there is excess
register pressure.
Jeff
More information about the Gcc
mailing list