wild load in gcc3
dalej@apple.com
dalej@apple.com
Wed Apr 25 11:36:00 GMT 2001
This seems to have been introduced recently. On my port it shows up in
gcc.c-torture/compile/20010408-1.c when built with -O3. It is connected
with the CALL_PLACEHOLDER stuff for tail recursion, so maybe
whoever's been working on that could look at it. The sequence is this:
expand_call() generates the PLACEHOLDER. The tail recursion code ends
with a branch to the beginning of the function; the target label is
marked PRESERVE so it won't be deleted. Also, this label is remembered
in the PLACEHOLDER.
But it may happen that this label is followed by another label, in which
case:
mark_jump_label() changes the branch in the tail recursion code to point
to the later label. It does not set the PRESERVE bit on the new label
or change the label recorded in the PLACEHOLDER.
cleanup_cfg() thinks the new label isn't worth preserving and deletes it.
If the tail recursion code is eventually selected for the PLACEHOLDER,
it contains a branch to a label that doesn't exist. A Bad Thing,
although since this is a compile-only test it may not fault on your
machine.
I'm not sure how best to fix it. mark_jump_label() would be my guess.
More information about the Gcc
mailing list