diff options
-rw-r--r-- | gcc/ChangeLog | 33 | ||||
-rw-r--r-- | gcc/Makefile.in | 24 | ||||
-rw-r--r-- | gcc/alias.c | 14 | ||||
-rw-r--r-- | gcc/basic-block.h | 6 | ||||
-rw-r--r-- | gcc/bb-reorder.c | 2 | ||||
-rw-r--r-- | gcc/bitmap.c | 3 | ||||
-rw-r--r-- | gcc/conflict.c | 1 | ||||
-rw-r--r-- | gcc/cse.c | 11 | ||||
-rw-r--r-- | gcc/flow.c | 26 | ||||
-rw-r--r-- | gcc/haifa-sched.c | 2 | ||||
-rw-r--r-- | gcc/hard-reg-set.h | 2 | ||||
-rw-r--r-- | gcc/ifcvt.c | 2 | ||||
-rw-r--r-- | gcc/local-alloc.c | 2 | ||||
-rw-r--r-- | gcc/loop.c | 2 | ||||
-rw-r--r-- | gcc/loop.h | 3 | ||||
-rw-r--r-- | gcc/predict.c | 3 | ||||
-rw-r--r-- | gcc/print-rtl.c | 2 | ||||
-rw-r--r-- | gcc/profile.c | 1 | ||||
-rw-r--r-- | gcc/regclass.c | 2 | ||||
-rw-r--r-- | gcc/regrename.c | 2 | ||||
-rw-r--r-- | gcc/regs.h | 2 | ||||
-rw-r--r-- | gcc/reload.c | 37 | ||||
-rw-r--r-- | gcc/reload1.c | 54 | ||||
-rw-r--r-- | gcc/sbitmap.c | 1 | ||||
-rw-r--r-- | gcc/toplev.c | 1 | ||||
-rw-r--r-- | gcc/unroll.c | 2 |
26 files changed, 159 insertions, 81 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b8166ac00c2..2d140d8713b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,36 @@ +Fri May 19 18:16:31 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * cse.c (cse_basic_block): Only call find_reg_note if REG_NOTES not 0. + * reload.c (find_equiv_reg): Likewise. + * alias.c (init_alias_analysis): Likewise. + Only call prologue_epilogue_contains on insns. + * basic-block.h (REG_SET_TO_HARD_REG_SET): Call new function. + * bb-reorder.c (hard-reg-set.h): Include earlier. + * haifa-sched.c (hard-reg-set.h): Likewise. + * ifcvt.c (hard-reg-set.h): Likewise. + * local-alloc.c (hard-reg-set.h): Likewise. + * loop.c (hard-reg-set.h): Likewise. + * predict.c (hard-reg-set.h): Likewise. + * regrename.c (hard-reg-set.h): Likewise. + * flow.c (hard-reg-set.h): Likewise. + (reg_set_to_hard_reg_set): New function. + * bitmap.c (regs.h, basic-block.h): No longer include. + (bitmap.h): Now include. + * conflict.c (hard-reg-set.h): Include. + * profile.c (hard-reg-set.h): Likewise. + * print-rtl.c (hard-reg-set.h): Likewise. + * sbitmap.c (hard-reg-set.h): Likewise. + * toplev.c (hard-reg-set.h): Likewise. + * unroll.c (hard-reg-set.h, basic-block.h): Likewise. + * hard-reg-set.h (reg_names): Now constant. + * regs.h (reg_names): Likewise. + * regclass.c (reg_names): Likewise. + * loop.h (basic-block.h): No longer include. + (bitmap.h): Now include. + * reload1.c (order_regs_for_reload): Avoid loop over reg sets. + * Makefile.in (LOOP_H, sbitmap.o, profile.o): Reflect above changes. + (toplev.o, print-rtl.o, conflict.o, unroll.o, bitmap.o): Likewise. + 2000-05-19 Jan Hubicka <jh@suse.cz> Richard Henderson <rth@cygnus.com> diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 0214e582ef2..bee8c2aa54b 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -771,7 +771,7 @@ RECOG_H = recog.h EXPR_H = expr.h insn-codes.h REGS_H = regs.h varray.h $(MACHMODE_H) INTEGRATE_H = integrate.h varray.h -LOOP_H = loop.h varray.h basic-block.h +LOOP_H = loop.h varray.h bitmap.h GCC_H = gcc.h version.h GGC_H = ggc.h varray.h TIMEVAR_H = timevar.h timevar.def @@ -1111,7 +1111,8 @@ c-iterate.o: c-iterate.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) c-tree.h \ mbchar.o: mbchar.c $(CONFIG_H) system.h mbchar.h graph.o: graph.c $(CONFIG_H) system.h toplev.h flags.h output.h $(RTL_H) \ function.h hard-reg-set.h $(BASIC_BLOCK_H) graph.h -sbitmap.o: sbitmap.c $(CONFIG_H) system.h $(RTL_H) flags.h $(BASIC_BLOCK_H) +sbitmap.o: sbitmap.c $(CONFIG_H) system.h $(RTL_H) flags.h hard-reg-set.h \ + $(BASIC_BLOCK_H) COLLECT2_OBJS = collect2.o tlink.o hash.o intl.o underscore.o version.o collect2$(exeext): $(COLLECT2_OBJS) $(LIBDEPS) @@ -1235,15 +1236,16 @@ diagnostic.o : diagnostic.c diagnostic.h \ toplev.o : toplev.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) function.h \ flags.h input.h insn-attr.h xcoffout.h defaults.h output.h \ insn-codes.h insn-config.h intl.h $(RECOG_H) Makefile toplev.h dwarfout.h \ - dwarf2out.h sdbout.h dbxout.h $(EXPR_H) $(BASIC_BLOCK_H) graph.h loop.h \ - except.h regs.h $(TIMEVAR_H) $(lang_options_files) + dwarf2out.h sdbout.h dbxout.h $(EXPR_H) hard-reg-set.h $(BASIC_BLOCK_H) \ + graph.h loop.h except.h regs.h $(TIMEVAR_H) $(lang_options_files) $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(MAYBE_USE_COLLECT2) \ -DTARGET_NAME=\"$(target_alias)\" \ -c `echo $(srcdir)/toplev.c | sed 's,^\./,,'` rtl.o : rtl.c $(CONFIG_H) system.h $(RTL_H) bitmap.h $(GGC_H) toplev.h -print-rtl.o : print-rtl.c $(CONFIG_H) system.h $(RTL_H) $(BASIC_BLOCK_H) +print-rtl.o : print-rtl.c $(CONFIG_H) system.h $(RTL_H) hard-reg-set.h \ + $(BASIC_BLOCK_H) rtlanal.o : rtlanal.c $(CONFIG_H) system.h $(RTL_H) errors.o : errors.c $(CONFIG_H) system.h errors.h @@ -1322,16 +1324,16 @@ lcm.o : lcm.c $(CONFIG_H) system.h $(RTL_H) $(REGS_H) hard-reg-set.h flags.h \ ssa.o : ssa.c $(CONFIG_H) system.h $(RTL_H) $(REGS_H) $(BASIC_BLOCK_H) \ output.h insn-config.h conflict.o : conflict.c $(CONFIG_H) system.h $(OBSTACK_H) $(HASHTAB_H) \ - $(RTL_H) $(BASIC_BLOCK_H) -profile.o : profile.c $(CONFIG_H) system.h $(RTL_H) flags.h insn-flags.h \ - gcov-io.h $(TREE_H) output.h $(REGS_H) toplev.h function.h insn-config.h \ - $(GGC_H) + $(RTL_H) hard-reg-set.h $(BASIC_BLOCK_H) +profile.o : profile.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h \ + insn-flags.h insn-config.h output.h $(REGS_H) $(EXPR_H) function.h \ + gcov-io.h toplev.h $(GGC_H) hard-reg-set.h $(BASIC_BLOCK_H) loop.o : loop.c $(CONFIG_H) system.h $(RTL_H) flags.h $(LOOP_H) insn-config.h \ insn-flags.h $(REGS_H) hard-reg-set.h $(RECOG_H) $(EXPR_H) real.h \ $(BASIC_BLOCK_H) function.h toplev.h varray.h except.h cselib.h unroll.o : unroll.c $(CONFIG_H) system.h $(RTL_H) insn-config.h function.h \ $(INTEGRATE_H) $(REGS_H) $(RECOG_H) flags.h $(EXPR_H) $(LOOP_H) toplev.h \ - varray.h + hard-reg-set.h varray.h $(BASIC_BLOCK_H) flow.o : flow.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) flags.h insn-config.h \ $(BASIC_BLOCK_H) $(REGS_H) hard-reg-set.h output.h toplev.h $(RECOG_H) \ insn-flags.h function.h except.h $(EXPR_H) @@ -1685,7 +1687,7 @@ $(HOST_PREFIX_1)print-rtl.o: $(srcdir)/print-rtl.c $(CONFIG_H) \ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(HOST_PREFIX)print-rtl.c $(HOST_PREFIX_1)bitmap.o: $(srcdir)/bitmap.c $(CONFIG_H) system.h $(RTL_H) \ - flags.h $(BASIC_BLOCK_H) $(REGS_H) + flags.h bitmap.h rm -f $(HOST_PREFIX)bitmap.c sed -e 's/config[.]h/hconfig.h/' $(srcdir)/bitmap.c > $(HOST_PREFIX)bitmap.c $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(HOST_PREFIX)bitmap.c diff --git a/gcc/alias.c b/gcc/alias.c index 0aab3625edb..56dfc9d6387 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -1704,19 +1704,22 @@ init_alias_analysis () /* Walk the insns adding values to the new_reg_base_value array. */ for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) { -#if defined (HAVE_prologue) || defined (HAVE_epilogue) - if (prologue_epilogue_contains (insn)) - continue; -#endif if (GET_RTX_CLASS (GET_CODE (insn)) == 'i') { rtx note, set; + +#if defined (HAVE_prologue) || defined (HAVE_epilogue) + if (prologue_epilogue_contains (insn)) + continue; +#endif + /* If this insn has a noalias note, process it, Otherwise, scan for sets. A simple set will have no side effects which could change the base value of any other register. */ if (GET_CODE (PATTERN (insn)) == SET - && (find_reg_note (insn, REG_NOALIAS, NULL_RTX))) + && REG_NOTES (insn) != 0 + && find_reg_note (insn, REG_NOALIAS, NULL_RTX)) record_set (SET_DEST (PATTERN (insn)), NULL_RTX, NULL); else note_stores (PATTERN (insn), record_set, NULL); @@ -1726,6 +1729,7 @@ init_alias_analysis () if (set != 0 && GET_CODE (SET_DEST (set)) == REG && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER + && REG_NOTES (insn) != 0 && (((note = find_reg_note (insn, REG_EQUAL, 0)) != 0 && REG_N_SETS (REGNO (SET_DEST (set))) == 1) || (note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != 0) diff --git a/gcc/basic-block.h b/gcc/basic-block.h index dec7707b436..fcdab68fe6e 100644 --- a/gcc/basic-block.h +++ b/gcc/basic-block.h @@ -70,13 +70,11 @@ typedef bitmap regset; #define REGNO_REG_SET_P(TO, REG) bitmap_bit_p (TO, REG) /* Copy the hard registers in a register set to the hard register set. */ +extern void reg_set_to_hard_reg_set PARAMS ((HARD_REG_SET *, bitmap)); #define REG_SET_TO_HARD_REG_SET(TO, FROM) \ do { \ - int i_; \ CLEAR_HARD_REG_SET (TO); \ - for (i_ = 0; i_ < FIRST_PSEUDO_REGISTER; i_++) \ - if (REGNO_REG_SET_P (FROM, i_)) \ - SET_HARD_REG_BIT (TO, i_); \ + reg_set_to_hard_reg_set (&TO, FROM); \ } while (0) /* Loop over all registers in REGSET, starting with MIN, setting REGNUM to the diff --git a/gcc/bb-reorder.c b/gcc/bb-reorder.c index c0c808a7636..ac1b990717c 100644 --- a/gcc/bb-reorder.c +++ b/gcc/bb-reorder.c @@ -29,10 +29,10 @@ #include "tree.h" #include "rtl.h" #include "tm_p.h" +#include "hard-reg-set.h" #include "basic-block.h" #include "insn-config.h" #include "regs.h" -#include "hard-reg-set.h" #include "flags.h" #include "output.h" #include "function.h" diff --git a/gcc/bitmap.c b/gcc/bitmap.c index 99b5f5a4e0e..d1588d8b7eb 100644 --- a/gcc/bitmap.c +++ b/gcc/bitmap.c @@ -23,8 +23,7 @@ Boston, MA 02111-1307, USA. */ #include "rtl.h" #include "flags.h" #include "obstack.h" -#include "regs.h" -#include "basic-block.h" +#include "bitmap.h" /* Obstack to allocate bitmap elements from. */ static struct obstack bitmap_obstack; diff --git a/gcc/conflict.c b/gcc/conflict.c index 3113aa7d8ad..f8e86093058 100644 --- a/gcc/conflict.c +++ b/gcc/conflict.c @@ -30,6 +30,7 @@ Boston, MA 02111-1307, USA. */ #include "obstack.h" #include "hashtab.h" #include "rtl.h" +#include "hard-reg-set.h" #include "basic-block.h" /* Use malloc to allocate obstack chunks. */ diff --git a/gcc/cse.c b/gcc/cse.c index 474857070ce..9f2f007fb76 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -7017,10 +7017,13 @@ cse_basic_block (from, to, next_branch, around_loop) its destination is the result of the block and hence should be recorded. */ - if ((p = find_reg_note (insn, REG_LIBCALL, NULL_RTX))) - libcall_insn = XEXP (p, 0); - else if (find_reg_note (insn, REG_RETVAL, NULL_RTX)) - libcall_insn = NULL_RTX; + if (REG_NOTES (insn) != 0) + { + if ((p = find_reg_note (insn, REG_LIBCALL, NULL_RTX))) + libcall_insn = XEXP (p, 0); + else if (find_reg_note (insn, REG_RETVAL, NULL_RTX)) + libcall_insn = 0; + } cse_insn (insn, libcall_insn); } diff --git a/gcc/flow.c b/gcc/flow.c index 08d61b15409..8c3eb830fe9 100644 --- a/gcc/flow.c +++ b/gcc/flow.c @@ -124,10 +124,10 @@ Boston, MA 02111-1307, USA. */ #include "tree.h" #include "rtl.h" #include "tm_p.h" +#include "hard-reg-set.h" #include "basic-block.h" #include "insn-config.h" #include "regs.h" -#include "hard-reg-set.h" #include "flags.h" #include "output.h" #include "function.h" @@ -7483,6 +7483,7 @@ flow_loops_find (loops) /* Return non-zero if edge E enters header of LOOP from outside of LOOP. */ + int flow_loop_outside_edge_p (loop, e) const struct loop *loop; @@ -7496,6 +7497,7 @@ flow_loop_outside_edge_p (loop, e) /* Clear LOG_LINKS fields of insns in a chain. */ + void clear_log_links (insns) rtx insns; @@ -7505,3 +7507,25 @@ clear_log_links (insns) if (GET_RTX_CLASS (GET_CODE (i)) == 'i') LOG_LINKS (i) = 0; } + +/* Given a register bitmap, turn on the bits in a HARD_REG_SET that + correspond to the hard registers, if any, set in that map. This + could be done far more efficiently by having all sorts of special-cases + with moving single words, but probably isn't worth the trouble. */ + +void +reg_set_to_hard_reg_set (to, from) + HARD_REG_SET *to; + bitmap from; +{ + int i; + + EXECUTE_IF_SET_IN_BITMAP + (from, 0, i, + { + if (i >= FIRST_PSEUDO_REGISTER) + return; + SET_HARD_REG_BIT (*to, i); + }); +} + diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c index aa0eddcb763..616db55b217 100644 --- a/gcc/haifa-sched.c +++ b/gcc/haifa-sched.c @@ -161,10 +161,10 @@ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "toplev.h" #include "rtl.h" #include "tm_p.h" +#include "hard-reg-set.h" #include "basic-block.h" #include "regs.h" #include "function.h" -#include "hard-reg-set.h" #include "flags.h" #include "insn-config.h" #include "insn-attr.h" diff --git a/gcc/hard-reg-set.h b/gcc/hard-reg-set.h index 8037edaacd5..6f1972f5620 100644 --- a/gcc/hard-reg-set.h +++ b/gcc/hard-reg-set.h @@ -471,4 +471,4 @@ extern int n_non_fixed_regs; /* Vector indexed by hardware reg giving its name. */ -extern const char *reg_names[FIRST_PSEUDO_REGISTER]; +extern const char * const reg_names[FIRST_PSEUDO_REGISTER]; diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index 371e5609353..d2bb6bd5726 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -27,10 +27,10 @@ #include "flags.h" #include "insn-config.h" #include "recog.h" +#include "hard-reg-set.h" #include "basic-block.h" #include "expr.h" #include "output.h" -#include "hard-reg-set.h" #include "tm_p.h" diff --git a/gcc/local-alloc.c b/gcc/local-alloc.c index e277f803425..bd6492980ea 100644 --- a/gcc/local-alloc.c +++ b/gcc/local-alloc.c @@ -65,10 +65,10 @@ Boston, MA 02111-1307, USA. */ #include "rtl.h" #include "tm_p.h" #include "flags.h" +#include "hard-reg-set.h" #include "basic-block.h" #include "regs.h" #include "function.h" -#include "hard-reg-set.h" #include "insn-config.h" #include "insn-attr.h" #include "recog.h" diff --git a/gcc/loop.c b/gcc/loop.c index a8e71b71545..df3ee526a68 100644 --- a/gcc/loop.c +++ b/gcc/loop.c @@ -42,11 +42,11 @@ Boston, MA 02111-1307, USA. */ #include "obstack.h" #include "function.h" #include "expr.h" +#include "hard-reg-set.h" #include "basic-block.h" #include "insn-config.h" #include "insn-flags.h" #include "regs.h" -#include "hard-reg-set.h" #include "recog.h" #include "flags.h" #include "real.h" diff --git a/gcc/loop.h b/gcc/loop.h index 046196fb235..3b8cb7a14e0 100644 --- a/gcc/loop.h +++ b/gcc/loop.h @@ -19,7 +19,8 @@ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "varray.h" -#include "basic-block.h" +#include "bitmap.h" + /* Flags passed to loop_optimize. */ #define LOOP_UNROLL 1 #define LOOP_BCT 2 diff --git a/gcc/predict.c b/gcc/predict.c index 85f3ea1dbca..837f2d7f520 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -26,6 +26,7 @@ Wu and Larus; MICRO-27. [3] "Corpus-based Static Branch Prediction" Calder, Grunwald, Lindsay, Martin, Mozer, and Zorn; PLDI '95. + */ @@ -34,10 +35,10 @@ #include "tree.h" #include "rtl.h" #include "tm_p.h" +#include "hard-reg-set.h" #include "basic-block.h" #include "insn-config.h" #include "regs.h" -#include "hard-reg-set.h" #include "flags.h" #include "output.h" #include "function.h" diff --git a/gcc/print-rtl.c b/gcc/print-rtl.c index 5cea980123b..544e5440856 100644 --- a/gcc/print-rtl.c +++ b/gcc/print-rtl.c @@ -25,9 +25,9 @@ Boston, MA 02111-1307, USA. */ #include "rtl.h" #include "real.h" #include "flags.h" +#include "hard-reg-set.h" #include "basic-block.h" - /* How to print out a register name. We don't use PRINT_REG because some definitions of PRINT_REG don't work here. */ diff --git a/gcc/profile.c b/gcc/profile.c index 960fbecb2c6..627d6e403dc 100644 --- a/gcc/profile.c +++ b/gcc/profile.c @@ -46,6 +46,7 @@ Boston, MA 02111-1307, USA. */ #include "gcov-io.h" #include "toplev.h" #include "ggc.h" +#include "hard-reg-set.h" #include "basic-block.h" diff --git a/gcc/regclass.c b/gcc/regclass.c index 592edb099ba..f4ed192f4f5 100644 --- a/gcc/regclass.c +++ b/gcc/regclass.c @@ -162,7 +162,7 @@ enum reg_class reg_class_superunion[N_REG_CLASSES][N_REG_CLASSES]; /* Array containing all of the register names */ -const char *reg_names[] = REGISTER_NAMES; +const char * const reg_names[] = REGISTER_NAMES; /* For each hard register, the widest mode object that it can contain. This will be a MODE_INT mode if the register can hold integers. Otherwise diff --git a/gcc/regrename.c b/gcc/regrename.c index d5e8160c94f..d2afeeca26c 100644 --- a/gcc/regrename.c +++ b/gcc/regrename.c @@ -22,10 +22,10 @@ #include "system.h" #include "tree.h" #include "rtl.h" +#include "hard-reg-set.h" #include "basic-block.h" #include "insn-config.h" #include "regs.h" -#include "hard-reg-set.h" #include "flags.h" #include "output.h" #include "function.h" diff --git a/gcc/regs.h b/gcc/regs.h index 26fa2473104..0f35ae66c8b 100644 --- a/gcc/regs.h +++ b/gcc/regs.h @@ -137,7 +137,7 @@ extern char regs_ever_live[FIRST_PSEUDO_REGISTER]; /* Vector indexed by hardware reg giving its name. */ -extern const char *reg_names[FIRST_PSEUDO_REGISTER]; +extern const char * const reg_names[FIRST_PSEUDO_REGISTER]; /* For each hard register, the widest mode object that it can contain. This will be a MODE_INT mode if the register can hold integers. Otherwise diff --git a/gcc/reload.c b/gcc/reload.c index e1f58387a0f..e94a3037be4 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -6032,27 +6032,30 @@ find_equiv_reg (goal, insn, class, other, reload_reg_p, goalreg, mode) /* If we are looking for a constant, and something equivalent to that constant was copied into a reg, we can use that reg. */ - || (goal_const && (tem = find_reg_note (p, REG_EQUIV, - NULL_RTX)) - && rtx_equal_p (XEXP (tem, 0), goal) - && (valueno = true_regnum (valtry = SET_DEST (pat))) >= 0) - || (goal_const && (tem = find_reg_note (p, REG_EQUIV, - NULL_RTX)) - && GET_CODE (SET_DEST (pat)) == REG - && GET_CODE (XEXP (tem, 0)) == CONST_DOUBLE - && GET_MODE_CLASS (GET_MODE (XEXP (tem, 0))) == MODE_FLOAT - && GET_CODE (goal) == CONST_INT - && 0 != (goaltry = operand_subword (XEXP (tem, 0), 0, 0, + || (goal_const && REG_NOTES (p) != 0 + && (tem = find_reg_note (p, REG_EQUIV, NULL_RTX)) + && ((rtx_equal_p (XEXP (tem, 0), goal) + && (valueno + = true_regnum (valtry = SET_DEST (pat))) >= 0) + || (GET_CODE (SET_DEST (pat)) == REG + && GET_CODE (XEXP (tem, 0)) == CONST_DOUBLE + && (GET_MODE_CLASS (GET_MODE (XEXP (tem, 0))) + == MODE_FLOAT) + && GET_CODE (goal) == CONST_INT + && 0 != (goaltry + = operand_subword (XEXP (tem, 0), 0, 0, VOIDmode)) - && rtx_equal_p (goal, goaltry) - && (valtry = operand_subword (SET_DEST (pat), 0, 0, - VOIDmode)) - && (valueno = true_regnum (valtry)) >= 0) + && rtx_equal_p (goal, goaltry) + && (valtry + = operand_subword (SET_DEST (pat), 0, 0, + VOIDmode)) + && (valueno = true_regnum (valtry)) >= 0))) || (goal_const && (tem = find_reg_note (p, REG_EQUIV, NULL_RTX)) && GET_CODE (SET_DEST (pat)) == REG && GET_CODE (XEXP (tem, 0)) == CONST_DOUBLE - && GET_MODE_CLASS (GET_MODE (XEXP (tem, 0))) == MODE_FLOAT + && (GET_MODE_CLASS (GET_MODE (XEXP (tem, 0))) + == MODE_FLOAT) && GET_CODE (goal) == CONST_INT && 0 != (goaltry = operand_subword (XEXP (tem, 0), 1, 0, VOIDmode)) @@ -6081,7 +6084,7 @@ find_equiv_reg (goal, insn, class, other, reload_reg_p, goalreg, mode) /* Don't try to re-use something that is killed in this insn. We want to be able to trust REG_UNUSED notes. */ - if (find_reg_note (where, REG_UNUSED, value)) + if (REG_NOTES (where) != 0 && find_reg_note (where, REG_UNUSED, value)) return 0; /* If we propose to get the value from the stack pointer or if GOAL is diff --git a/gcc/reload1.c b/gcc/reload1.c index 446a0c01c20..3ff2b4555fc 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -1210,6 +1210,7 @@ reload (first, global, dumpfile) fatal_insn later. We clear the corresponding regnos in the live register sets to avoid this. The whole thing is rather sick, I'm afraid. */ + static void maybe_fix_stack_asms () { @@ -1512,29 +1513,29 @@ count_pseudo (reg) /* Calculate the SPILL_COST and SPILL_ADD_COST arrays and determine the contents of BAD_SPILL_REGS for the insn described by CHAIN. */ + static void order_regs_for_reload (chain) struct insn_chain *chain; { register int i, j; + HARD_REG_SET used_by_pseudos; + HARD_REG_SET used_by_pseudos2; - COPY_HARD_REG_SET (bad_spill_regs, bad_spill_regs_global); + COPY_HARD_REG_SET (bad_spill_regs, fixed_reg_set); memset (spill_cost, 0, sizeof spill_cost); memset (spill_add_cost, 0, sizeof spill_add_cost); /* Count number of uses of each hard reg by pseudo regs allocated to it - and then order them by decreasing use. */ + and then order them by decreasing use. First exclude hard registers + that are live in or across this insn. */ + + REG_SET_TO_HARD_REG_SET (used_by_pseudos, &chain->live_throughout); + REG_SET_TO_HARD_REG_SET (used_by_pseudos2, &chain->dead_or_set); + IOR_HARD_REG_SET (bad_spill_regs, used_by_pseudos); + IOR_HARD_REG_SET (bad_spill_regs, used_by_pseudos2); - for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) - { - /* Test the various reasons why we can't use a register for - spilling in this insn. */ - if (fixed_regs[i] - || REGNO_REG_SET_P (&chain->live_throughout, i) - || REGNO_REG_SET_P (&chain->dead_or_set, i)) - SET_HARD_REG_BIT (bad_spill_regs, i); - } /* Now find out which pseudos are allocated to it, and update hard_reg_n_uses. */ CLEAR_REG_SET (&pseudos_counted); @@ -3517,20 +3518,21 @@ finish_spills (global, dumpfile) else spill_reg_order[i] = -1; - for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++) - if (REGNO_REG_SET_P (&spilled_pseudos, i)) - { - /* Record the current hard register the pseudo is allocated to in - pseudo_previous_regs so we avoid reallocating it to the same - hard reg in a later pass. */ - if (reg_renumber[i] < 0) - abort (); - SET_HARD_REG_BIT (pseudo_previous_regs[i], reg_renumber[i]); - /* Mark it as no longer having a hard register home. */ - reg_renumber[i] = -1; - /* We will need to scan everything again. */ - something_changed = 1; - } + EXECUTE_IF_SET_IN_REG_SET + (&spilled_pseudos, FIRST_PSEUDO_REGISTER, i, + { + /* Record the current hard register the pseudo is allocated to in + pseudo_previous_regs so we avoid reallocating it to the same + hard reg in a later pass. */ + if (reg_renumber[i] < 0) + abort (); + + SET_HARD_REG_BIT (pseudo_previous_regs[i], reg_renumber[i]); + /* Mark it as no longer having a hard register home. */ + reg_renumber[i] = -1; + /* We will need to scan everything again. */ + something_changed = 1; + }); /* Retry global register allocation if possible. */ if (global) @@ -5062,6 +5064,7 @@ allocate_reload_reg (chain, r, last_reload) /* Initialize all the tables needed to allocate reload registers. CHAIN is the insn currently being processed; SAVE_RELOAD_REG_RTX is the array we use to restore the reg_rtx field for every reload. */ + static void choose_reload_regs_init (chain, save_reload_reg_rtx) struct insn_chain *chain; @@ -5093,6 +5096,7 @@ choose_reload_regs_init (chain, save_reload_reg_rtx) compute_use_by_pseudos (®_used_in_insn, &chain->live_throughout); compute_use_by_pseudos (®_used_in_insn, &chain->dead_or_set); } + for (i = 0; i < reload_n_operands; i++) { CLEAR_HARD_REG_SET (reload_reg_used_in_output[i]); diff --git a/gcc/sbitmap.c b/gcc/sbitmap.c index a6f710e0cc2..e3f9a9fd74d 100644 --- a/gcc/sbitmap.c +++ b/gcc/sbitmap.c @@ -22,6 +22,7 @@ Boston, MA 02111-1307, USA. */ #include "system.h" #include "rtl.h" #include "flags.h" +#include "hard-reg-set.h" #include "basic-block.h" /* Bitmap manipulation routines. */ diff --git a/gcc/toplev.c b/gcc/toplev.c index e70188901da..9f13b9a528d 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -54,6 +54,7 @@ Boston, MA 02111-1307, USA. */ #include "function.h" #include "toplev.h" #include "expr.h" +#include "hard-reg-set.h" #include "basic-block.h" #include "intl.h" #include "ggc.h" diff --git a/gcc/unroll.c b/gcc/unroll.c index 82d2d69d836..f234a81490e 100644 --- a/gcc/unroll.c +++ b/gcc/unroll.c @@ -160,6 +160,8 @@ enum unroll_types { UNROLL_COMPLETELY, UNROLL_MODULO, UNROLL_NAIVE }; #include "expr.h" #include "loop.h" #include "toplev.h" +#include "hard-reg-set.h" +#include "basic-block.h" /* This controls which loops are unrolled, and by how much we unroll them. */ |