aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/Makefile.in2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/warn/Wuninitialized-1.C15
-rw-r--r--gcc/tree-ssa-dse.c32
5 files changed, 52 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ecf9e46..f9ca880 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2009-01-26 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/38851
+ * Makefile.in (tree-ssa-dse.o): Add langhooks.h.
+ * tree-ssa-dse.c: Include langhooks.h
+ (execute_simple_dse): Remove stores with zero size.
+
2009-01-24 Jakub Jelinek <jakub@redhat.com>
PR c/38957
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 8b214b9..ab461e7 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -2110,7 +2110,7 @@ tree-outof-ssa.o : tree-outof-ssa.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
tree-ssa-dse.o : tree-ssa-dse.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(TM_H) $(GGC_H) $(TREE_H) $(RTL_H) $(TM_P_H) $(BASIC_BLOCK_H) \
$(TREE_FLOW_H) tree-pass.h $(TREE_DUMP_H) domwalk.h $(FLAGS_H) \
- $(DIAGNOSTIC_H) $(TIMEVAR_H)
+ $(DIAGNOSTIC_H) $(TIMEVAR_H) langhooks.h
tree-ssa-forwprop.o : tree-ssa-forwprop.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(TM_H) $(GGC_H) $(TREE_H) $(RTL_H) $(TM_P_H) $(BASIC_BLOCK_H) \
$(TREE_FLOW_H) tree-pass.h $(TREE_DUMP_H) $(DIAGNOSTIC_H) $(TIMEVAR_H) \
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d079da9..ea1493a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-01-26 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/38851
+ * g++.dg/warn/Wuninitialized-1.C: New testcase.
+
2009-01-25 Hans-Peter Nilsson <hp@axis.com>
* gcc.dg/bitfld-15.c: Gate warning on target
diff --git a/gcc/testsuite/g++.dg/warn/Wuninitialized-1.C b/gcc/testsuite/g++.dg/warn/Wuninitialized-1.C
new file mode 100644
index 0000000..7b1b90b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wuninitialized-1.C
@@ -0,0 +1,15 @@
+/* { dg-options "-O2 -Wuninitialized" } */
+
+struct Empty { Empty() {} }; /* { dg-bogus "uninitialized" } */
+struct Other {
+ Other(const Empty& e_) : e(e_) {}
+ Empty e;
+};
+void bar(Other&);
+void foo()
+{
+ Empty e;
+ Other o(e);
+ bar(o);
+}
+
diff --git a/gcc/tree-ssa-dse.c b/gcc/tree-ssa-dse.c
index b4be514..8a72495 100644
--- a/gcc/tree-ssa-dse.c
+++ b/gcc/tree-ssa-dse.c
@@ -34,6 +34,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree-dump.h"
#include "domwalk.h"
#include "flags.h"
+#include "langhooks.h"
/* This file implements dead store elimination.
@@ -660,20 +661,35 @@ execute_simple_dse (void)
tree op;
bool removed = false;
ssa_op_iter iter;
+ tree size;
- if (gimple_stored_syms (stmt)
- && !bitmap_empty_p (gimple_stored_syms (stmt))
- && (is_gimple_assign (stmt)
- || (is_gimple_call (stmt)
- && gimple_call_lhs (stmt)))
- && !bitmap_intersect_p (gimple_stored_syms (stmt), variables_loaded))
+ if (is_gimple_assign (stmt)
+ && AGGREGATE_TYPE_P (TREE_TYPE (gimple_assign_lhs (stmt)))
+ && (size = lang_hooks.expr_size (gimple_assign_lhs (stmt)))
+ && integer_zerop (size))
+ {
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ {
+ fprintf (dump_file, " Deleted zero-sized store '");
+ print_gimple_stmt (dump_file, stmt, 0, dump_flags);
+ fprintf (dump_file, "'\n");
+ }
+ removed = true;
+ gsi_remove (&gsi, true);
+ todo |= TODO_cleanup_cfg;
+ }
+ else if (gimple_stored_syms (stmt)
+ && !bitmap_empty_p (gimple_stored_syms (stmt))
+ && (is_gimple_assign (stmt)
+ || (is_gimple_call (stmt)
+ && gimple_call_lhs (stmt)))
+ && !bitmap_intersect_p (gimple_stored_syms (stmt),
+ variables_loaded))
{
unsigned int i;
bitmap_iterator bi;
bool dead = true;
-
-
/* See if STMT only stores to write-only variables and
verify that there are no volatile operands. tree-ssa-operands
sets has_volatile_ops flag for all statements involving