aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSteven Bosscher <steven@gcc.gnu.org>2007-01-18 08:17:06 +0000
committerSteven Bosscher <steven@gcc.gnu.org>2007-01-18 08:17:06 +0000
commitaeceeb06a15d71d55fcc41c0ff3b3b9be01c79a1 (patch)
tree454922e216b8e55458271a4dd8cad1c5803279a6 /gcc
parent0eb5e2b93d6816f51c3d61ca837853c9364fbb6f (diff)
downloadgcc-aeceeb06a15d71d55fcc41c0ff3b3b9be01c79a1.zip
gcc-aeceeb06a15d71d55fcc41c0ff3b3b9be01c79a1.tar.gz
gcc-aeceeb06a15d71d55fcc41c0ff3b3b9be01c79a1.tar.bz2
cfgcleanup.c (cleanup_cfg): Detect cfglayout mode and set the CLEANUP_CFGLAYOUT flag when in cfglayout mode.
* 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. From-SVN: r120893
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/Makefile.in2
-rw-r--r--gcc/cfgcleanup.c6
-rw-r--r--gcc/cfglayout.c3
-rw-r--r--gcc/cfglayout.h3
-rw-r--r--gcc/gengtype.c2
-rw-r--r--gcc/ifcvt.c8
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;