On Sun, May 08, 2005 at 10:26:19PM +0200, Steven Bosscher wrote:
> Oops. Not a modified tree, non-standard command line options:
> -O -fgcse --param max-cse-path-length=1
Ah, I see. Well, I think this is a misfeature of gcse in how
it decides how to update expressions. With a bit more thought
we could do better.
For instance, given
(insn 13 8 15 0 (set (reg/f:SI 121)
(high:SI (symbol_ref:SI ("x") [flags 0x44] <var_decl 0xf7d5e3c0 x>)))
218 {elf_high} (nil) (nil))
Register 121 used 1 times across 0 insns; set 1 time; dies in 0 places; pointer.
We can see that insn 13 dominates all uses of (high (symbol_ref x)),
so why don't we make *that* the reaching reg?
With something like this:
extern char *x;
void
foo (_Bool *p, char *a, char *b)
{
int i;
for (i = 0; i < 10; ++i)
if (p[i])
x[i] = a;
else
x[i] = b;
}
We get
PRE: redundant insn 36 (expression 3) in bb 3, reaching reg is 135
PRE: redundant insn 27 (expression 3) in bb 2, reaching reg is 135
LOCAL COPY-PROP: Replacing reg 130 in insn 29 with reg 135
LOCAL COPY-PROP: Replacing reg 133 in insn 38 with reg 135
GLOBAL CONST-PROP: Replacing reg 135 in insn 65 with
constant (high:SI (symbol_ref:SI ("x") [flags 0x44] <var_decl 0xf7d5e3c0 x>))
GLOBAL CONST-PROP: Replacing reg 135 in insn 64 with
constant (high:SI (symbol_ref:SI ("x") [flags 0x44] <var_decl 0xf7d5e3c0 x>))
but insns 64 and 65 are dead. They were the copies from the reaching
reg 135 to the original regs 130 and 133, which COPY-PROP rightly
bypassed for us.
I guess it doesn't really matter that we did the CONST-PROP, but it's
certainly going to skew your statictics. It would be surely be nice
if we could avoid this sort of thing, but I don't see how we can without
spending more cycles than we'd save.
I suppose for testing you could run a dce pass between COPY-PROP and
CONST-PROP, then see how much is left for CONST-PROP to do. Perhaps
we can determine that it doesn't do enough to be worth running. But
you're not going to be able to tell that easily right now.
r~