diff options
Diffstat (limited to 'gcc')
| -rw-r--r-- | gcc/ChangeLog | 47 | ||||
| -rw-r--r-- | gcc/basic-block.h | 4 | ||||
| -rw-r--r-- | gcc/cfgbuild.c | 2 | ||||
| -rw-r--r-- | gcc/cfglayout.c | 26 | ||||
| -rw-r--r-- | gcc/cfgrtl.c | 71 | ||||
| -rw-r--r-- | gcc/combine.c | 1 | ||||
| -rw-r--r-- | gcc/emit-rtl.c | 43 | ||||
| -rw-r--r-- | gcc/final.c | 3 | ||||
| -rw-r--r-- | gcc/flow.c | 12 | ||||
| -rw-r--r-- | gcc/gcse.c | 4 | ||||
| -rw-r--r-- | gcc/integrate.c | 3 | ||||
| -rw-r--r-- | gcc/jump.c | 16 | ||||
| -rw-r--r-- | gcc/loop.c | 17 | ||||
| -rw-r--r-- | gcc/print-rtl.c | 5 | ||||
| -rw-r--r-- | gcc/recog.c | 3 | ||||
| -rw-r--r-- | gcc/rtl.c | 1 | ||||
| -rw-r--r-- | gcc/rtl.def | 28 | ||||
| -rw-r--r-- | gcc/rtl.h | 46 | ||||
| -rw-r--r-- | gcc/sched-ebb.c | 4 | ||||
| -rw-r--r-- | gcc/sched-rgn.c | 4 | ||||
| -rw-r--r-- | gcc/toplev.c | 5 | ||||
| -rw-r--r-- | gcc/unroll.c | 50 | 
22 files changed, 169 insertions, 226 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f931d52e98d..5243079f11f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,50 @@ +Sun Jun  2 23:02:11 CEST 2002  Jan Hubicka  <jh@suse.cz> + +	* loop.c (emit_prefetch_instructions): Properly place the address computation. + +Sun Jun  2 22:56:48 CEST 2002  Jan Hubicka  <jh@suse.cz> + +	* basic-block.h (basic_block_for_insn, BLOCK_FOR_INSN): Kill. +	(set_block_for_insn): Turn into macro. +	* cfgbuild.c (find_basic_block): Do not clear basic_block_for_insn. +	* cfglayout.c (insn_scopes): Kill. +	(scope_to_insns_initialize): Do not use insn_scopes. +	(scope_to_insns_finalize): Likewise. +	(duplicate_insn_chain): Likewise. +	(cfg_layout_initialize, cfg_layout_finalize): Do not turn scopes to notes. +	* cfgrtl.c (basic_block_for_insn): Kill. +	(delete_insn_and_edges, delete_insn_chain_and_edges): Simplify. +	(create_basic_block_structure): Use reorder_insns. +	(compute_bb_for_insn): Do not use basic_block_for_insn. +	(merge_blocks_nomove): Likewise. +	(update_bb_for_insn): Likewise. +	(verify_flow_info): Likewise. +	(set_block_for_insn): Kill. +	* combine.c (try_combine): Update gen_rtx_INSN call. +	* emit-rtl.c (gen_label_rtx): Update gen_rtx_CODE_LABEL call. +	(mark_insn_raw, make_jump_insn_raw, make_call_insn_raw): Clear +	scopes and BBs. +	(add_insn_after, add_insn_before, remove_insn, reorder_insns): Simplify. +	(emit_note_before, emit_note_after, emit_line_note_after, emit_note): +	Clear BB. +	(emit_insns_after): Simplify. +	(emit_copy_of_insn_after): Copy scope. +	* final.c (final_start_function): Lower scopes. +	* flow.c (check_function_return_warnings): Do not rely on deleted insn. +	* integrate.c (copy_insn_list): Cope scopes. +	* jump.c (duplicate_loop_exit_test): LIkewise; simplify. +	* loop.c (loop_optimize): Do not care block notes. +	* print-rtl.c (print_rtx): Print BB. +	* recog.c (apply_change_group): Simplify. +	* rtl.c (copy_rtx): Handle 'B'. +	* rtl.def (INSN, CALL_INSN, JUMP_INSN, NOTE): Add extra fields. +	* rtl.h (Field accessors): Update indexes. +	* sched-ebb.c (schedule_ebbs): Do not lower notes. +	* sched-rgn.c (schedule_insns): Likewise. +	* toplev.c (rest_of_compilation): Lower notes. +	* unroll.c (unroll_loop): Do not care scoping notes. +	(copy_loop_body): Copy scopes. +  2002-06-02  Neil Booth  <neil@daikokuya.demon.co.uk>  config/h8300: diff --git a/gcc/basic-block.h b/gcc/basic-block.h index 4fe64d44c92..3f015a83434 100644 --- a/gcc/basic-block.h +++ b/gcc/basic-block.h @@ -303,14 +303,12 @@ extern struct basic_block_def entry_exit_blocks[2];  #define ENTRY_BLOCK_PTR	(&entry_exit_blocks[0])  #define EXIT_BLOCK_PTR	(&entry_exit_blocks[1]) -extern varray_type basic_block_for_insn; -#define BLOCK_FOR_INSN(INSN)  VARRAY_BB (basic_block_for_insn, INSN_UID (INSN))  #define BLOCK_NUM(INSN)	      (BLOCK_FOR_INSN (INSN)->index + 0) +#define set_block_for_insn(INSN, BB)  (BLOCK_FOR_INSN (INSN) = BB)  extern void compute_bb_for_insn		PARAMS ((int));  extern void free_bb_for_insn		PARAMS ((void));  extern void update_bb_for_insn		PARAMS ((basic_block)); -extern void set_block_for_insn		PARAMS ((rtx, basic_block));  extern void free_basic_block_vars	PARAMS ((int)); diff --git a/gcc/cfgbuild.c b/gcc/cfgbuild.c index bdf175d53af..0352fbe52a0 100644 --- a/gcc/cfgbuild.c +++ b/gcc/cfgbuild.c @@ -617,8 +617,6 @@ find_basic_blocks (f, nregs, file)    timevar_push (TV_CFG); -  basic_block_for_insn = 0; -    /* Flush out existing data.  */    if (basic_block_info != NULL)      { diff --git a/gcc/cfglayout.c b/gcc/cfglayout.c index 494fa7c96eb..0c648b65f67 100644 --- a/gcc/cfglayout.c +++ b/gcc/cfglayout.c @@ -50,9 +50,6 @@ static void cleanup_unconditional_jumps	PARAMS ((void));  static void fixup_fallthru_exit_predecessor PARAMS ((void));  static rtx unlink_insn_chain PARAMS ((rtx, rtx));  static rtx duplicate_insn_chain PARAMS ((rtx, rtx)); - -/* Map insn uid to lexical block.  */ -static varray_type insn_scopes;  static rtx  unlink_insn_chain (first, last) @@ -219,8 +216,6 @@ scope_to_insns_initialize ()    tree block = NULL;    rtx insn, next; -  VARRAY_TREE_INIT (insn_scopes, get_max_uid (), "insn scopes"); -    for (insn = get_insns (); insn; insn = next)      {        next = NEXT_INSN (insn); @@ -228,7 +223,7 @@ scope_to_insns_initialize ()        if (active_insn_p (insn)  	  && GET_CODE (PATTERN (insn)) != ADDR_VEC  	  && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC) -	VARRAY_TREE (insn_scopes, INSN_UID (insn)) = block; +        INSN_SCOPE (insn) = block;        else if (GET_CODE (insn) == NOTE)  	{  	  switch (NOTE_LINE_NUMBER (insn)) @@ -324,13 +319,14 @@ scope_to_insns_finalize ()       the common parent easily.  */    set_block_levels (cur_block, 0); -  for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) +  insn = get_insns (); +  if (!active_insn_p (insn)) +    insn = next_active_insn (insn); +  for (; insn; insn = next_active_insn (insn))      {        tree this_block; -      if ((size_t) INSN_UID (insn) >= insn_scopes->num_elements) -	continue; -      this_block = VARRAY_TREE (insn_scopes, INSN_UID (insn)); +      this_block = INSN_SCOPE (insn);        if (! this_block)  	continue; @@ -341,8 +337,6 @@ scope_to_insns_finalize ()  	}      } -  VARRAY_FREE (insn_scopes); -    /* change_scope emits before the insn, not after.  */    note = emit_note (NULL, NOTE_INSN_DELETED);    change_scope (note, cur_block, DECL_INITIAL (cfun->decl)); @@ -742,10 +736,6 @@ duplicate_insn_chain (from, to)  	      || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)  	    break;  	  new = emit_copy_of_insn_after (insn, get_last_insn ()); -	  /* Record the INSN_SCOPE.  */ -	  VARRAY_GROW (insn_scopes, INSN_UID (new) + 1); -	  VARRAY_TREE (insn_scopes, INSN_UID (new)) -	    = VARRAY_TREE (insn_scopes, INSN_UID (insn));  	  break;  	case CODE_LABEL: @@ -958,8 +948,6 @@ cfg_layout_initialize ()    cleanup_unconditional_jumps (); -  scope_to_insns_initialize (); -    record_effective_endpoints ();  } @@ -976,8 +964,6 @@ cfg_layout_finalize ()    verify_insn_chain ();  #endif -  scope_to_insns_finalize (); -    free_aux_for_blocks ();  #ifdef ENABLE_CHECKING diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index f721b12f916..e40ecf23dea 100644 --- a/gcc/cfgrtl.c +++ b/gcc/cfgrtl.c @@ -64,9 +64,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA  #define gen_return() NULL_RTX  #endif -/* The basic block structure for every insn, indexed by uid.  */ -varray_type basic_block_for_insn; -  /* The labels mentioned in non-jump rtl.  Valid during find_basic_blocks.  */  /* ??? Should probably be using LABEL_NUSES instead.  It would take a     bit of surgery to be able to use or co-opt the routines in jump.  */ @@ -187,9 +184,7 @@ delete_insn_and_edges (insn)    rtx x;    bool purge = false; -  if (basic_block_for_insn -      && INSN_P (insn) -      && (unsigned int)INSN_UID (insn) < basic_block_for_insn->num_elements +  if (INSN_P (insn)        && BLOCK_FOR_INSN (insn)        && BLOCK_FOR_INSN (insn)->end == insn)      purge = true; @@ -232,9 +227,7 @@ delete_insn_chain_and_edges (first, last)  {    bool purge = false; -  if (basic_block_for_insn -      && INSN_P (last) -      && (unsigned int)INSN_UID (last) < basic_block_for_insn->num_elements +  if (INSN_P (last)        && BLOCK_FOR_INSN (last)        && BLOCK_FOR_INSN (last)->end == last)      purge = true; @@ -277,7 +270,7 @@ create_basic_block_structure (index, head, end, bb_note, after)  	}        if (after != bb_note && NEXT_INSN (after) != bb_note) -	reorder_insns (bb_note, bb_note, after); +	reorder_insns_nobb (bb_note, bb_note, after);      }    else      { @@ -315,8 +308,7 @@ create_basic_block_structure (index, head, end, bb_note, after)    bb->flags = BB_NEW;    link_block (bb, after);    BASIC_BLOCK (index) = bb; -  if (basic_block_for_insn) -    update_bb_for_insn (bb); +  update_bb_for_insn (bb);    /* Tag the block so that we know it has been used when considering       other basic block notes.  */ @@ -440,11 +432,6 @@ compute_bb_for_insn (max)  {    basic_block bb; -  if (basic_block_for_insn) -    VARRAY_FREE (basic_block_for_insn); - -  VARRAY_BB_INIT (basic_block_for_insn, max, "basic_block_for_insn"); -    FOR_EACH_BB (bb)      {        rtx end = bb->end; @@ -452,9 +439,7 @@ compute_bb_for_insn (max)        for (insn = bb->head; ; insn = NEXT_INSN (insn))  	{ -	  if (INSN_UID (insn) < max) -	    VARRAY_BB (basic_block_for_insn, INSN_UID (insn)) = bb; - +	  BLOCK_FOR_INSN (insn) = bb;  	  if (insn == end)  	    break;  	} @@ -466,10 +451,10 @@ compute_bb_for_insn (max)  void  free_bb_for_insn ()  { -  if (basic_block_for_insn) -    VARRAY_FREE (basic_block_for_insn); - -  basic_block_for_insn = 0; +  rtx insn; +  for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) +    if (GET_CODE (insn) != BARRIER) +      BLOCK_FOR_INSN (insn) = NULL;  }  /* Update insns block within BB.  */ @@ -480,9 +465,6 @@ update_bb_for_insn (bb)  {    rtx insn; -  if (! basic_block_for_insn) -    return; -    for (insn = bb->head; ; insn = NEXT_INSN (insn))      {        set_block_for_insn (insn, bb); @@ -490,26 +472,6 @@ update_bb_for_insn (bb)  	break;      }  } - -/* Record INSN's block as BB.  */ - -void -set_block_for_insn (insn, bb) -     rtx insn; -     basic_block bb; -{ -  size_t uid = INSN_UID (insn); - -  if (uid >= basic_block_for_insn->num_elements) -    { -      /* Add one-eighth the size so we don't keep calling xrealloc.  */ -      size_t new_size = uid + (uid + 7) / 8; - -      VARRAY_GROW (basic_block_for_insn, new_size); -    } - -  VARRAY_BB (basic_block_for_insn, uid) = bb; -}  /* Split a block BB after insn INSN creating a new fallthru edge.     Return the new edge.  Note that to keep other parts of the compiler happy, @@ -668,15 +630,12 @@ merge_blocks_nomove (a, b)    /* Reassociate the insns of B with A.  */    if (!b_empty)      { -      if (basic_block_for_insn) -	{ -	  rtx x; +      rtx x; -	  for (x = a_end; x != b_end; x = NEXT_INSN (x)) -	    set_block_for_insn (x, a); +      for (x = a_end; x != b_end; x = NEXT_INSN (x)) +	set_block_for_insn (x, a); -	  set_block_for_insn (b_end, a); -	} +      set_block_for_insn (b_end, a);        a_end = b_end;      } @@ -697,8 +656,6 @@ block_label (block)    if (GET_CODE (block->head) != CODE_LABEL)      {        block->head = emit_label_before (gen_label_rtx (), block->head); -      if (basic_block_for_insn) -	set_block_for_insn (block->head, block);      }    return block->head; @@ -1972,7 +1929,7 @@ verify_flow_info ()  	}        for (x = bb->head; x != NEXT_INSN (bb->end); x = NEXT_INSN (x)) -	if (basic_block_for_insn && BLOCK_FOR_INSN (x) != bb) +	if (BLOCK_FOR_INSN (x) != bb)  	  {  	    debug_rtx (x);  	    if (! BLOCK_FOR_INSN (x)) diff --git a/gcc/combine.c b/gcc/combine.c index f0e44314869..fe247ea7dc2 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -1755,6 +1755,7 @@ try_combine (i3, i2, i1, new_direct_jump_p)  	  subst_prev_insn = i1  	    = gen_rtx_INSN (VOIDmode, INSN_UID (i2), NULL_RTX, i2, +			    BLOCK_FOR_INSN (i2), INSN_SCOPE (i2),  			    XVECEXP (PATTERN (i2), 0, 1), -1, NULL_RTX,  			    NULL_RTX); diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 8f8f701e17b..237f23d8642 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -2175,8 +2175,8 @@ gen_label_rtx ()  {    rtx label; -  label = gen_rtx_CODE_LABEL (VOIDmode, 0, NULL_RTX, -			      NULL_RTX, label_num++, NULL, NULL); +  label = gen_rtx_CODE_LABEL (VOIDmode, 0, NULL_RTX, NULL_RTX, +		  	      NULL, label_num++, NULL, NULL);    LABEL_NUSES (label) = 0;    LABEL_ALTERNATE_NAME (label) = NULL; @@ -3253,6 +3253,8 @@ make_insn_raw (pattern)    INSN_CODE (insn) = -1;    LOG_LINKS (insn) = NULL;    REG_NOTES (insn) = NULL; +  INSN_SCOPE (insn) = NULL; +  BLOCK_FOR_INSN (insn) = NULL;  #ifdef ENABLE_RTL_CHECKING    if (insn @@ -3285,6 +3287,8 @@ make_jump_insn_raw (pattern)    LOG_LINKS (insn) = NULL;    REG_NOTES (insn) = NULL;    JUMP_LABEL (insn) = NULL; +  INSN_SCOPE (insn) = NULL; +  BLOCK_FOR_INSN (insn) = NULL;    return insn;  } @@ -3305,6 +3309,8 @@ make_call_insn_raw (pattern)    LOG_LINKS (insn) = NULL;    REG_NOTES (insn) = NULL;    CALL_INSN_FUNCTION_USAGE (insn) = NULL; +  INSN_SCOPE (insn) = NULL; +  BLOCK_FOR_INSN (insn) = NULL;    return insn;  } @@ -3369,8 +3375,8 @@ add_insn_after (insn, after)  	abort ();      } -  if (basic_block_for_insn -      && (unsigned int) INSN_UID (after) < basic_block_for_insn->num_elements +  if (GET_CODE (after) != BARRIER +      && GET_CODE (insn) != BARRIER        && (bb = BLOCK_FOR_INSN (after)))      {        set_block_for_insn (insn, bb); @@ -3438,8 +3444,8 @@ add_insn_before (insn, before)  	abort ();      } -  if (basic_block_for_insn -      && (unsigned int) INSN_UID (before) < basic_block_for_insn->num_elements +  if (GET_CODE (before) != BARRIER +      && GET_CODE (insn) != BARRIER        && (bb = BLOCK_FOR_INSN (before)))      {        set_block_for_insn (insn, bb); @@ -3518,8 +3524,7 @@ remove_insn (insn)        if (stack == 0)  	abort ();      } -  if (basic_block_for_insn -      && (unsigned int) INSN_UID (insn) < basic_block_for_insn->num_elements +  if (GET_CODE (insn) != BARRIER        && (bb = BLOCK_FOR_INSN (insn)))      {        if (INSN_P (insn)) @@ -3596,16 +3601,13 @@ reorder_insns (from, to, after)    reorder_insns_nobb (from, to, after); -  if (basic_block_for_insn -      && (unsigned int) INSN_UID (after) < basic_block_for_insn->num_elements +  if (GET_CODE (after) != BARRIER        && (bb = BLOCK_FOR_INSN (after)))      {        rtx x;        bb->flags |= BB_DIRTY; -      if (basic_block_for_insn -	  && ((unsigned int) INSN_UID (from) -	      < basic_block_for_insn->num_elements) +      if (GET_CODE (from) != BARRIER  	  && (bb2 = BLOCK_FOR_INSN (from)))  	{  	  if (bb2->end == to) @@ -3913,6 +3915,7 @@ emit_note_before (subtype, before)    INSN_UID (note) = cur_insn_uid++;    NOTE_SOURCE_FILE (note) = 0;    NOTE_LINE_NUMBER (note) = subtype; +  BLOCK_FOR_INSN (note) = NULL;    add_insn_before (note, before);    return note; @@ -4033,6 +4036,7 @@ emit_note_after (subtype, after)    INSN_UID (note) = cur_insn_uid++;    NOTE_SOURCE_FILE (note) = 0;    NOTE_LINE_NUMBER (note) = subtype; +  BLOCK_FOR_INSN (note) = NULL;    add_insn_after (note, after);    return note;  } @@ -4057,6 +4061,7 @@ emit_line_note_after (file, line, after)    INSN_UID (note) = cur_insn_uid++;    NOTE_SOURCE_FILE (note) = file;    NOTE_LINE_NUMBER (note) = line; +  BLOCK_FOR_INSN (note) = NULL;    add_insn_after (note, after);    return note;  } @@ -4152,14 +4157,15 @@ emit_insns_after (first, after)    if (!first)      return after; -  if (basic_block_for_insn -      && (unsigned int) INSN_UID (after) < basic_block_for_insn->num_elements +  if (GET_CODE (after) != BARRIER        && (bb = BLOCK_FOR_INSN (after)))      {        bb->flags |= BB_DIRTY;        for (last = first; NEXT_INSN (last); last = NEXT_INSN (last)) -	set_block_for_insn (last, bb); -      set_block_for_insn (last, bb); +        if (GET_CODE (last) != BARRIER) +	  set_block_for_insn (last, bb); +      if (GET_CODE (last) != BARRIER) +        set_block_for_insn (last, bb);        if (bb->end == after)  	bb->end = last;      } @@ -4295,6 +4301,7 @@ emit_note (file, line)    INSN_UID (note) = cur_insn_uid++;    NOTE_SOURCE_FILE (note) = file;    NOTE_LINE_NUMBER (note) = line; +  BLOCK_FOR_INSN (note) = NULL;    add_insn (note);    return note;  } @@ -5212,6 +5219,8 @@ emit_copy_of_insn_after (insn, after)    /* Update LABEL_NUSES.  */    mark_jump_label (PATTERN (new), new, 0); +  INSN_SCOPE (new) = INSN_SCOPE (insn); +    /* Copy all REG_NOTES except REG_LABEL since mark_jump_label will       make them.  */    for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) diff --git a/gcc/final.c b/gcc/final.c index 25a4e84c423..f58190a6958 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -69,6 +69,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA  #include "debug.h"  #include "expr.h"  #include "profile.h" +#include "cfglayout.h"  #ifdef XCOFF_DEBUGGING_INFO  #include "xcoffout.h"		/* Needed for external data @@ -1671,7 +1672,7 @@ final_start_function (first, file, optimize)    if (write_symbols)      {        remove_unnecessary_notes (); -      reorder_blocks (); +      scope_to_insns_finalize ();        number_blocks (current_function_decl);        /* We never actually put out begin/end notes for the top-level  	 block in the function.  But, conceptually, that block is diff --git a/gcc/flow.c b/gcc/flow.c index 78cd43990aa..6c81d48d08b 100644 --- a/gcc/flow.c +++ b/gcc/flow.c @@ -373,10 +373,14 @@ check_function_return_warnings ()  	 is no longer in the chain.  */        if (INSN_UID (cfun->x_clobber_return_insn) < max_uid)  	{ -	  /* Recompute insn->block mapping, since the initial mapping is -	     set before we delete unreachable blocks.  */ -	  if (BLOCK_FOR_INSN (cfun->x_clobber_return_insn) != NULL) -	    warning ("control reaches end of non-void function"); +	  rtx insn; + +	  for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) +	    if (insn == cfun->x_clobber_return_insn) +	      { +	        warning ("control reaches end of non-void function"); +		break; +	      }  	}      }  } diff --git a/gcc/gcse.c b/gcc/gcse.c index cd2481096af..19d46b1877d 100644 --- a/gcc/gcse.c +++ b/gcc/gcse.c @@ -4541,10 +4541,10 @@ bypass_conditional_jumps ()  	      {  		if (setcc)  		  break; -		if (GET_CODE (PATTERN (setcc)) != SET) +		if (GET_CODE (PATTERN (insn)) != SET)  		  break; -		dest = SET_DEST (PATTERN (setcc)); +		dest = SET_DEST (PATTERN (insn));  		if (REG_P (dest) || CC0_P (dest))  		  setcc = insn;  		else diff --git a/gcc/integrate.c b/gcc/integrate.c index cf9413ee516..6de4f22b7b5 100644 --- a/gcc/integrate.c +++ b/gcc/integrate.c @@ -1334,6 +1334,7 @@ copy_insn_list (insns, map, static_chain_value)        switch (GET_CODE (insn))  	{  	case INSN: +	  INSN_SCOPE (copy) = INSN_SCOPE (insn);  	  pattern = PATTERN (insn);  	  set = single_set (insn);  	  copy = 0; @@ -1507,6 +1508,7 @@ copy_insn_list (insns, map, static_chain_value)  	  break;  	case JUMP_INSN: +	  INSN_SCOPE (copy) = INSN_SCOPE (insn);  	  if (map->integrating && returnjump_p (insn))  	    {  	      if (map->local_return_label == 0) @@ -1553,6 +1555,7 @@ copy_insn_list (insns, map, static_chain_value)  	  /* If this is a CALL_PLACEHOLDER insn then we need to copy the  	     three attached sequences: normal call, sibling call and tail  	     recursion.  */ +	  INSN_SCOPE (copy) = INSN_SCOPE (insn);  	  if (GET_CODE (PATTERN (insn)) == CALL_PLACEHOLDER)  	    {  	      rtx sequence[3]; diff --git a/gcc/jump.c b/gcc/jump.c index f32b831c6df..0937336ba1a 100644 --- a/gcc/jump.c +++ b/gcc/jump.c @@ -305,8 +305,6 @@ duplicate_loop_exit_test (loop_start)  	 is a CODE_LABEL  	 has a REG_RETVAL or REG_LIBCALL note (hard to adjust)  	 is a NOTE_INSN_LOOP_BEG because this means we have a nested loop -	 is a NOTE_INSN_BLOCK_{BEG,END} because duplicating these notes -	      is not valid.       We also do not do this if we find an insn with ASM_OPERANDS.  While       this restriction should not be necessary, copying an insn with @@ -326,18 +324,6 @@ duplicate_loop_exit_test (loop_start)  	case CALL_INSN:  	  return 0;  	case NOTE: -	  /* We could be in front of the wrong NOTE_INSN_LOOP_END if there is -	     a jump immediately after the loop start that branches outside -	     the loop but within an outer loop, near the exit test. -	     If we copied this exit test and created a phony -	     NOTE_INSN_LOOP_VTOP, this could make instructions immediately -	     before the exit test look like these could be safely moved -	     out of the loop even if they actually may be never executed. -	     This can be avoided by checking here for NOTE_INSN_LOOP_CONT.  */ - -	  if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG -	      || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_CONT) -	    return 0;  	  if (optimize < 2  	      && (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG @@ -423,6 +409,7 @@ duplicate_loop_exit_test (loop_start)  	    replace_regs (PATTERN (copy), reg_map, max_reg, 1);  	  mark_jump_label (PATTERN (copy), copy, 0); +	  INSN_SCOPE (copy) = INSN_SCOPE (insn);  	  /* Copy all REG_NOTES except REG_LABEL since mark_jump_label will  	     make them.  */ @@ -448,6 +435,7 @@ duplicate_loop_exit_test (loop_start)  	case JUMP_INSN:  	  copy = emit_jump_insn_before (copy_insn (PATTERN (insn)),  					loop_start); +	  INSN_SCOPE (copy) = INSN_SCOPE (insn);  	  if (reg_map)  	    replace_regs (PATTERN (copy), reg_map, max_reg, 1);  	  mark_jump_label (PATTERN (copy), copy, 0); diff --git a/gcc/loop.c b/gcc/loop.c index 20c5f1dab0a..bc75f8ba3b8 100644 --- a/gcc/loop.c +++ b/gcc/loop.c @@ -566,13 +566,6 @@ loop_optimize (f, dumpfile, flags)  	scan_loop (loop, flags);      } -  /* If there were lexical blocks inside the loop, they have been -     replicated.  We will now have more than one NOTE_INSN_BLOCK_BEG -     and NOTE_INSN_BLOCK_END for each such block.  We must duplicate -     the BLOCKs as well.  */ -  if (write_symbols != NO_DEBUG) -    reorder_blocks (); -    end_alias_analysis ();    /* Clean up.  */ @@ -4139,6 +4132,7 @@ emit_prefetch_instructions (loop)  	  int bytes_ahead = PREFETCH_BLOCK * (ahead + y);  	  rtx before_insn = info[i].giv->insn;  	  rtx prev_insn = PREV_INSN (info[i].giv->insn); +	  rtx seq;  	  /* We can save some effort by offsetting the address on  	     architectures with offsettable memory references.  */ @@ -4153,13 +4147,16 @@ emit_prefetch_instructions (loop)  	      loc = reg;  	    } +	  start_sequence ();  	  /* Make sure the address operand is valid for prefetch.  */  	  if (! (*insn_data[(int)CODE_FOR_prefetch].operand[0].predicate)  		  (loc, insn_data[(int)CODE_FOR_prefetch].operand[0].mode))  	    loc = force_reg (Pmode, loc); -	  emit_insn_before (gen_prefetch (loc, GEN_INT (info[i].write), -					  GEN_INT (3)), -			    before_insn); +	  emit_insn (gen_prefetch (loc, GEN_INT (info[i].write), +				   GEN_INT (3))); +	  seq = gen_sequence (); +	  end_sequence (); +	  emit_insn_before (seq, before_insn);  	  /* Check all insns emitted and record the new GIV  	     information.  */ diff --git a/gcc/print-rtl.c b/gcc/print-rtl.c index 823ffa0c513..723fd0d3eb5 100644 --- a/gcc/print-rtl.c +++ b/gcc/print-rtl.c @@ -475,6 +475,11 @@ print_rtx (in_rtx)  	sawclose = 0;  	break; +      case 'B': +	if (XBBDEF (in_rtx, i)) +	  fprintf (outfile, " %i", XBBDEF (in_rtx, i)->index); +	break; +        default:  	fprintf (stderr,  		 "switch format wrong in rtl.print_rtx(). format was: %c.\n", diff --git a/gcc/recog.c b/gcc/recog.c index 10287450e81..6ad82eeae1d 100644 --- a/gcc/recog.c +++ b/gcc/recog.c @@ -397,9 +397,6 @@ apply_change_group ()        for (i = 0; i < num_changes; i++)  	if (changes[i].object  	    && INSN_P (changes[i].object) -	    && basic_block_for_insn -	    && ((unsigned int)INSN_UID (changes[i].object) -		< basic_block_for_insn->num_elements)  	    && (bb = BLOCK_FOR_INSN (changes[i].object)))  	  bb->flags |= BB_DIRTY; diff --git a/gcc/rtl.c b/gcc/rtl.c index 13e7380369b..da753b58428 100644 --- a/gcc/rtl.c +++ b/gcc/rtl.c @@ -369,6 +369,7 @@ copy_rtx (orig)  	case 'S':  	case 'T':  	case 'u': +	case 'B':  	case '0':  	  /* These are left unchanged.  */  	  break; diff --git a/gcc/rtl.def b/gcc/rtl.def index 71c2ef18ab1..270f1a842ac 100644 --- a/gcc/rtl.def +++ b/gcc/rtl.def @@ -545,37 +545,37 @@ DEF_RTL_EXPR (ATTR_FLAG, "attr_flag", "s", 'x')     ---------------------------------------------------------------------- */  /* An instruction that cannot jump.  */ -DEF_RTL_EXPR(INSN, "insn", "iuueiee", 'i') +DEF_RTL_EXPR(INSN, "insn", "iuuBteiee", 'i')  /* An instruction that can possibly jump.     Fields ( rtx->fld[] ) have exact same meaning as INSN's.  */ -DEF_RTL_EXPR(JUMP_INSN, "jump_insn", "iuueiee0", 'i') +DEF_RTL_EXPR(JUMP_INSN, "jump_insn", "iuuBteiee0", 'i')  /* An instruction that can possibly call a subroutine     but which will not change which instruction comes next     in the current function. -   Field ( rtx->fld[7] ) is CALL_INSN_FUNCTION_USAGE. +   Field ( rtx->fld[9] ) is CALL_INSN_FUNCTION_USAGE.     All other fields ( rtx->fld[] ) have exact same meaning as INSN's.  */ -DEF_RTL_EXPR(CALL_INSN, "call_insn", "iuueieee", 'i') +DEF_RTL_EXPR(CALL_INSN, "call_insn", "iuuBteieee", 'i')  /* A marker that indicates that control will not flow through.  */  DEF_RTL_EXPR(BARRIER, "barrier", "iuu", 'x')  /* Holds a label that is followed by instructions.     Operand: -   3: is used in jump.c for the use-count of the label. -   4: is used in flow.c to point to the chain of label_ref's to this label. -   5: is a number that is unique in the entire compilation. -   6: is the user-given name of the label, if any. -   7: is the alternate label name.  */ -DEF_RTL_EXPR(CODE_LABEL, "code_label", "iuu00iss", 'x') +   4: is used in jump.c for the use-count of the label. +   5: is used in flow.c to point to the chain of label_ref's to this label. +   6: is a number that is unique in the entire compilation. +   7: is the user-given name of the label, if any. +   8: is the alternate label name.  */ +DEF_RTL_EXPR(CODE_LABEL, "code_label", "iuuB00iss", 'x')  /* Say where in the code a source line starts, for symbol table's sake.     Operand: -   3: filename, if line number > 0, note-specific data otherwise. -   4: line number if > 0, enum note_insn otherwise. -   5: unique number if line number == note_insn_deleted_label.  */ -DEF_RTL_EXPR(NOTE, "note", "iuu0ni", 'x') +   4: filename, if line number > 0, note-specific data otherwise. +   5: line number if > 0, enum note_insn otherwise. +   6: unique number if line number == note_insn_deleted_label.  */ +DEF_RTL_EXPR(NOTE, "note", "iuuB0ni", 'x')  /* ----------------------------------------------------------------------     Top level constituents of INSN, JUMP_INSN and CALL_INSN. diff --git a/gcc/rtl.h b/gcc/rtl.h index b1218d0ef1c..ff7f1c0d5aa 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -506,19 +506,21 @@ do {				\  #define PREV_INSN(INSN)	XEXP (INSN, 1)  #define NEXT_INSN(INSN)	XEXP (INSN, 2) +#define BLOCK_FOR_INSN(INSN) XBBDEF (INSN, 3) +#define INSN_SCOPE(INSN) XTREE (INSN, 4)  /* The body of an insn.  */ -#define PATTERN(INSN)	XEXP (INSN, 3) +#define PATTERN(INSN)	XEXP (INSN, 5)  /* Code number of instruction, from when it was recognized.     -1 means this instruction has not been recognized yet.  */ -#define INSN_CODE(INSN) XINT (INSN, 4) +#define INSN_CODE(INSN) XINT (INSN, 6)  /* Set up in flow.c; empty before then.     Holds a chain of INSN_LIST rtx's whose first operands point at     previous insns with direct data-flow connections to this one.     That means that those insns set variables whose next use is in this insn.     They are always in the same basic block as this insn.  */ -#define LOG_LINKS(INSN)	XEXP(INSN, 5) +#define LOG_LINKS(INSN)	XEXP(INSN, 7)  #define RTX_INTEGRATED_P(RTX)						\    (RTL_FLAG_CHECK8("RTX_INTEGRATED_P", (RTX), INSN, CALL_INSN,		\ @@ -570,7 +572,7 @@ do {				\     The mode field of the EXPR_LIST contains not a real machine mode     but a value from enum reg_note.  */ -#define REG_NOTES(INSN)	XEXP(INSN, 6) +#define REG_NOTES(INSN)	XEXP(INSN, 8)  /* Don't forget to change reg_note_name in rtl.c.  */  enum reg_note @@ -739,12 +741,12 @@ extern const char * const reg_note_name[];       CLOBBER expressions document the registers explicitly clobbered     by this CALL_INSN.       Pseudo registers can not be mentioned in this list.  */ -#define CALL_INSN_FUNCTION_USAGE(INSN)	XEXP(INSN, 7) +#define CALL_INSN_FUNCTION_USAGE(INSN)	XEXP(INSN, 9)  /* The label-number of a code-label.  The assembler label     is made from `L' and the label-number printed in decimal.     Label numbers are unique in a compilation.  */ -#define CODE_LABEL_NUMBER(INSN)	XINT (INSN, 5) +#define CODE_LABEL_NUMBER(INSN)	XINT (INSN, 6)  #define LINE_NUMBER NOTE @@ -755,18 +757,18 @@ extern const char * const reg_note_name[];     The NOTE_INSN_RANGE_{START,END} and NOTE_INSN_LIVE notes record their     information as an rtx in the field.  */ -#define NOTE_SOURCE_FILE(INSN) 	XCSTR (INSN, 3, NOTE) -#define NOTE_BLOCK(INSN)	XCTREE (INSN, 3, NOTE) -#define NOTE_EH_HANDLER(INSN)	XCINT (INSN, 3, NOTE) -#define NOTE_RANGE_INFO(INSN)  	XCEXP (INSN, 3, NOTE) -#define NOTE_LIVE_INFO(INSN)   	XCEXP (INSN, 3, NOTE) -#define NOTE_BASIC_BLOCK(INSN)	XCBBDEF (INSN, 3, NOTE) -#define NOTE_EXPECTED_VALUE(INSN) XCEXP (INSN, 3, NOTE) -#define NOTE_PREDICTION(INSN)   XCINT (INSN, 3, NOTE) +#define NOTE_SOURCE_FILE(INSN) 	XCSTR (INSN, 4, NOTE) +#define NOTE_BLOCK(INSN)	XCTREE (INSN, 4, NOTE) +#define NOTE_EH_HANDLER(INSN)	XCINT (INSN, 4, NOTE) +#define NOTE_RANGE_INFO(INSN)  	XCEXP (INSN, 4, NOTE) +#define NOTE_LIVE_INFO(INSN)   	XCEXP (INSN, 4, NOTE) +#define NOTE_BASIC_BLOCK(INSN)	XCBBDEF (INSN, 4, NOTE) +#define NOTE_EXPECTED_VALUE(INSN) XCEXP (INSN, 4, NOTE) +#define NOTE_PREDICTION(INSN)   XCINT (INSN, 4, NOTE)  /* In a NOTE that is a line number, this is the line number.     Other kinds of NOTEs are identified by negative numbers here.  */ -#define NOTE_LINE_NUMBER(INSN) XCINT (INSN, 4, NOTE) +#define NOTE_LINE_NUMBER(INSN) XCINT (INSN, 5, NOTE)  /* Nonzero if INSN is a note marking the beginning of a basic block.  */  #define NOTE_INSN_BASIC_BLOCK_P(INSN) 			\ @@ -774,8 +776,8 @@ extern const char * const reg_note_name[];     && NOTE_LINE_NUMBER (INSN) == NOTE_INSN_BASIC_BLOCK)  /* Algorithm and flags for prediction.  */ -#define NOTE_PREDICTION_ALG(INSN)   (XCINT(INSN, 3, NOTE)>>8) -#define NOTE_PREDICTION_FLAGS(INSN) (XCINT(INSN, 3, NOTE)&0xff) +#define NOTE_PREDICTION_ALG(INSN)   (XCINT(INSN, 4, NOTE)>>8) +#define NOTE_PREDICTION_FLAGS(INSN) (XCINT(INSN, 4, NOTE)&0xff)  #define NOTE_PREDICT(ALG,FLAGS)     ((ALG<<8)+(FLAGS))  /* Codes that appear in the NOTE_LINE_NUMBER field @@ -880,14 +882,14 @@ extern const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS];  /* The name of a label, in case it corresponds to an explicit label     in the input source code.  */ -#define LABEL_NAME(RTX) XCSTR (RTX, 6, CODE_LABEL) +#define LABEL_NAME(RTX) XCSTR (RTX, 7, CODE_LABEL)  /* In jump.c, each label contains a count of the number     of LABEL_REFs that point at it, so unused labels can be deleted.  */ -#define LABEL_NUSES(RTX) XCINT (RTX, 3, CODE_LABEL) +#define LABEL_NUSES(RTX) XCINT (RTX, 4, CODE_LABEL)  /* Associate a name with a CODE_LABEL.  */ -#define LABEL_ALTERNATE_NAME(RTX) XCSTR (RTX, 7, CODE_LABEL) +#define LABEL_ALTERNATE_NAME(RTX) XCSTR (RTX, 8, CODE_LABEL)  /* The original regno this ADDRESSOF was built for.  */  #define ADDRESSOF_REGNO(RTX) XCUINT (RTX, 1, ADDRESSOF) @@ -898,13 +900,13 @@ extern const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS];  /* In jump.c, each JUMP_INSN can point to a label that it can jump to,     so that if the JUMP_INSN is deleted, the label's LABEL_NUSES can     be decremented and possibly the label can be deleted.  */ -#define JUMP_LABEL(INSN)   XCEXP (INSN, 7, JUMP_INSN) +#define JUMP_LABEL(INSN)   XCEXP (INSN, 9, JUMP_INSN)  /* Once basic blocks are found in flow.c,     each CODE_LABEL starts a chain that goes through     all the LABEL_REFs that jump to that label.     The chain eventually winds up at the CODE_LABEL: it is circular.  */ -#define LABEL_REFS(LABEL) XCEXP (LABEL, 4, CODE_LABEL) +#define LABEL_REFS(LABEL) XCEXP (LABEL, 5, CODE_LABEL)  /* This is the field in the LABEL_REF through which the circular chain     of references to a particular label is linked. diff --git a/gcc/sched-ebb.c b/gcc/sched-ebb.c index fd4556e5fe1..91bf88ec2b9 100644 --- a/gcc/sched-ebb.c +++ b/gcc/sched-ebb.c @@ -286,8 +286,6 @@ schedule_ebbs (dump_file)    if (n_basic_blocks == 0)      return; -  scope_to_insns_initialize (); -    sched_init (dump_file);    current_sched_info = &ebb_sched_info; @@ -355,7 +353,5 @@ schedule_ebbs (dump_file)    if (write_symbols != NO_DEBUG)      rm_redundant_line_notes (); -  scope_to_insns_finalize (); -    sched_finish ();  } diff --git a/gcc/sched-rgn.c b/gcc/sched-rgn.c index e2ea6b76117..280f33089d6 100644 --- a/gcc/sched-rgn.c +++ b/gcc/sched-rgn.c @@ -2989,8 +2989,6 @@ schedule_insns (dump_file)    if (n_basic_blocks == 0)      return; -  scope_to_insns_initialize (); -    nr_inter = 0;    nr_spec = 0; @@ -3079,8 +3077,6 @@ schedule_insns (dump_file)    if (write_symbols != NO_DEBUG)      rm_redundant_line_notes (); -  scope_to_insns_finalize (); -    if (sched_verbose)      {        if (reload_completed == 0 && flag_schedule_interblock) diff --git a/gcc/toplev.c b/gcc/toplev.c index b9432f44c35..6eecb966138 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -2570,9 +2570,10 @@ rest_of_compilation (decl)  	    && NOTE_LINE_NUMBER (insn) == NOTE_INSN_PREDICTION)  	  delete_insn (insn);      } -   close_dump_file (DFI_sibling, print_rtl, get_insns ()); -   timevar_pop (TV_JUMP); +  close_dump_file (DFI_sibling, print_rtl, get_insns ()); +  timevar_pop (TV_JUMP); +  scope_to_insns_initialize ();    /* Complete generation of exception handling code.  */    find_exception_handler_labels ();    if (doing_eh (0)) diff --git a/gcc/unroll.c b/gcc/unroll.c index ceec66ee0d3..26fcaf7223f 100644 --- a/gcc/unroll.c +++ b/gcc/unroll.c @@ -268,53 +268,6 @@ unroll_loop (loop, insn_count, strength_reduce_p)        return;      } -  /* When emitting debugger info, we can't unroll loops with unequal numbers -     of block_beg and block_end notes, because that would unbalance the block -     structure of the function.  This can happen as a result of the -     "if (foo) bar; else break;" optimization in jump.c.  */ -  /* ??? Gcc has a general policy that -g is never supposed to change the code -     that the compiler emits, so we must disable this optimization always, -     even if debug info is not being output.  This is rare, so this should -     not be a significant performance problem.  */ - -  if (1 /* write_symbols != NO_DEBUG */) -    { -      int block_begins = 0; -      int block_ends = 0; - -      for (insn = loop_start; insn != loop_end; insn = NEXT_INSN (insn)) -	{ -	  if (GET_CODE (insn) == NOTE) -	    { -	      if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG) -		block_begins++; -	      else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_END) -		block_ends++; -	      if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_EH_REGION_BEG -		  || NOTE_LINE_NUMBER (insn) == NOTE_INSN_EH_REGION_END) -		{ -		  /* Note, would be nice to add code to unroll EH -		     regions, but until that time, we punt (don't -		     unroll).  For the proper way of doing it, see -		     expand_inline_function.  */ - -		  if (loop_dump_stream) -		    fprintf (loop_dump_stream, -			     "Unrolling failure: cannot unroll EH regions.\n"); -		  return; -		} -	    } -	} - -      if (block_begins != block_ends) -	{ -	  if (loop_dump_stream) -	    fprintf (loop_dump_stream, -		     "Unrolling failure: Unbalanced block notes.\n"); -	  return; -	} -    } -    /* Determine type of unroll to perform.  Depends on the number of iterations       and the size of the loop.  */ @@ -2046,6 +1999,7 @@ copy_loop_body (loop, copy_start, copy_end, map, exit_label, last_iteration,  	      copy = emit_insn (pattern);  	    }  	  REG_NOTES (copy) = initial_reg_note_copy (REG_NOTES (insn), map); +	  INSN_SCOPE (copy) = INSN_SCOPE (insn);  #ifdef HAVE_cc0  	  /* If this insn is setting CC0, it may need to look at @@ -2092,6 +2046,7 @@ copy_loop_body (loop, copy_start, copy_end, map, exit_label, last_iteration,  	  pattern = copy_rtx_and_substitute (PATTERN (insn), map, 0);  	  copy = emit_jump_insn (pattern);  	  REG_NOTES (copy) = initial_reg_note_copy (REG_NOTES (insn), map); +	  INSN_SCOPE (copy) = INSN_SCOPE (insn);  	  if (JUMP_LABEL (insn))  	    { @@ -2215,6 +2170,7 @@ copy_loop_body (loop, copy_start, copy_end, map, exit_label, last_iteration,  	  pattern = copy_rtx_and_substitute (PATTERN (insn), map, 0);  	  copy = emit_call_insn (pattern);  	  REG_NOTES (copy) = initial_reg_note_copy (REG_NOTES (insn), map); +	  INSN_SCOPE (copy) = INSN_SCOPE (insn);  	  SIBLING_CALL_P (copy) = SIBLING_CALL_P (insn);  	  /* Because the USAGE information potentially contains objects other  | 

