wild load in gcc3

law@redhat.com law@redhat.com
Wed Apr 25 12:48:00 GMT 2001


  In message < 200104251836.LAA19321@scv1.apple.com >you write:
  > 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.
See my most recent change to jump.c
jeff



More information about the Gcc mailing list