diff options
-rw-r--r-- | gcc/ChangeLog | 14 | ||||
-rw-r--r-- | gcc/Makefile.in | 2 | ||||
-rw-r--r-- | gcc/cfgcleanup.c | 6 | ||||
-rw-r--r-- | gcc/cfglayout.c | 3 | ||||
-rw-r--r-- | gcc/cfglayout.h | 3 | ||||
-rw-r--r-- | gcc/gengtype.c | 2 | ||||
-rw-r--r-- | gcc/ifcvt.c | 8 |
7 files changed, 32 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 81ffc51..caaf932 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +18-01-2007 Steven Bosscher <steven@gcc.gnu.org> + + * cfgcleanup.c (cleanup_cfg): Detect cfglayout mode and set + the CLEANUP_CFGLAYOUT flag when in cfglayout mode. + + * Makefile.c (GTFILES): Add cfglayout.h. + * gengtype.c (open_base_files): Likewise. + * cfglayout.c (cfg_layout_function_footer, + cfg_layout_function_header) Reindent to make gengtype happy. + * cfglayout.h (cfg_layout_function_footer, + cfg_layout_function_header): Add GTY(()) marker. + + * ifcvt.c (noce_try_sign_mask): Make sure INSN_B is non-null. + 2007-01-18 Ben Elliston <bje@au.ibm.com> * genautomata.c (write_automata): Include xstrerror output in the diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 3346116..f272142 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -2805,7 +2805,7 @@ GTFILES = $(srcdir)/input.h $(srcdir)/coretypes.h \ $(srcdir)/function.c $(srcdir)/except.h \ $(srcdir)/gcse.c $(srcdir)/integrate.c $(srcdir)/lists.c $(srcdir)/optabs.c \ $(srcdir)/profile.c $(srcdir)/regclass.c \ - $(srcdir)/reg-stack.c $(srcdir)/cfglayout.c \ + $(srcdir)/reg-stack.c $(srcdir)/cfglayout.c $(srcdir)/cfglayout.h \ $(srcdir)/sdbout.c $(srcdir)/stor-layout.c \ $(srcdir)/stringpool.c $(srcdir)/tree.c $(srcdir)/varasm.c \ $(srcdir)/tree-mudflap.c $(srcdir)/tree-flow.h \ diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index ad9ae4f..7f2abf1 100644 --- a/gcc/cfgcleanup.c +++ b/gcc/cfgcleanup.c @@ -2220,6 +2220,12 @@ cleanup_cfg (int mode) { bool changed = false; + /* Set the cfglayout mode flag here. We could update all the callers + but that is just inconvenient, especially given that we eventually + want to have cfglayout mode as the default. */ + if (current_ir_type () == IR_RTL_CFGLAYOUT) + mode |= CLEANUP_CFGLAYOUT; + timevar_push (TV_CLEANUP_CFG); if (delete_unreachable_blocks ()) { diff --git a/gcc/cfglayout.c b/gcc/cfglayout.c index 15bde05..eacfd99 100644 --- a/gcc/cfglayout.c +++ b/gcc/cfglayout.c @@ -40,7 +40,8 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA #include "vecprim.h" /* Holds the interesting trailing notes for the function. */ -rtx cfg_layout_function_footer, cfg_layout_function_header; +rtx cfg_layout_function_footer; +rtx cfg_layout_function_header; static rtx skip_insns_after_block (basic_block); static void record_effective_endpoints (void); diff --git a/gcc/cfglayout.h b/gcc/cfglayout.h index 4bc1e67..e2c00ad 100644 --- a/gcc/cfglayout.h +++ b/gcc/cfglayout.h @@ -23,7 +23,8 @@ #include "basic-block.h" -extern rtx cfg_layout_function_footer; +extern GTY(()) rtx cfg_layout_function_footer; +extern GTY(()) rtx cfg_layout_function_header; extern void cfg_layout_initialize (unsigned int); extern void cfg_layout_finalize (void); diff --git a/gcc/gengtype.c b/gcc/gengtype.c index f62659a..1413d6f 100644 --- a/gcc/gengtype.c +++ b/gcc/gengtype.c @@ -1107,7 +1107,7 @@ open_base_files (void) "hard-reg-set.h", "basic-block.h", "cselib.h", "insn-addr.h", "optabs.h", "libfuncs.h", "debug.h", "ggc.h", "cgraph.h", "tree-flow.h", "reload.h", "cpp-id-data.h", "tree-chrec.h", - "except.h", "output.h", NULL + "cfglayout.h", "except.h", "output.h", NULL }; const char *const *ifp; outf_p gtype_desc_c; diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index 9e65a25..99228a8 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -1866,6 +1866,7 @@ noce_try_sign_mask (struct noce_if_info *if_info) rtx cond, t, m, c, seq; enum machine_mode mode; enum rtx_code code; + bool b_unconditional; if (no_new_pseudos) return FALSE; @@ -1899,9 +1900,12 @@ noce_try_sign_mask (struct noce_if_info *if_info) /* This is only profitable if T is cheap, or T is unconditionally executed/evaluated in the original insn sequence. The latter - happens if INSN_B was taken from TEST_BB. */ + happens if INSN_B was taken from TEST_BB, or if there was no + INSN_B which can happen for e.g. conditional stores to memory. */ + b_unconditional = (if_info->insn_b == NULL_RTX + || BLOCK_FOR_INSN (if_info->insn_b) == if_info->test_bb); if (rtx_cost (t, SET) >= COSTS_N_INSNS (2) - && (BLOCK_FOR_INSN (if_info->insn_b) != if_info->test_bb + && (!b_unconditional || t != if_info->b)) return FALSE; |