aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2009-12-19 11:41:14 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2009-12-19 11:41:14 +0000
commitb0ce048a3f7a78329145d0f48d63d3cabab8908b (patch)
treeb79b59574bc3002cae55a8d89312d1276031bd74 /gcc
parentd0ca0bcb2cc8291e2b4d8135fc623c40768b9642 (diff)
downloadgcc-b0ce048a3f7a78329145d0f48d63d3cabab8908b.zip
gcc-b0ce048a3f7a78329145d0f48d63d3cabab8908b.tar.gz
gcc-b0ce048a3f7a78329145d0f48d63d3cabab8908b.tar.bz2
re PR lto/42401 (wrong-code with -flto)
2009-12-19 Richard Guenther <rguenther@suse.de> PR lto/42401 * lto-streamer-out.c (tree_is_indexable): Local statics are indexable. (lto_output_tree_ref): Adjust assert. * g++.dg/lto/20091219_0.C: New testcase. From-SVN: r155361
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/lto-streamer-out.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/lto/20091219_0.C17
4 files changed, 33 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 136083c..be75066 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2009-12-19 Richard Guenther <rguenther@suse.de>
+ PR lto/42401
+ * lto-streamer-out.c (tree_is_indexable): Local statics
+ are indexable.
+ (lto_output_tree_ref): Adjust assert.
+
+2009-12-19 Richard Guenther <rguenther@suse.de>
+
PR tree-optimization/42108
* tree-ssa-sccvn.c (last_vuse_ptr): New variable.
(vn_reference_lookup_2): Update last seen VUSE.
diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c
index c489e42..f81ff72 100644
--- a/gcc/lto-streamer-out.c
+++ b/gcc/lto-streamer-out.c
@@ -638,7 +638,8 @@ tree_is_indexable (tree t)
{
if (TREE_CODE (t) == PARM_DECL)
return false;
- else if (TREE_CODE (t) == VAR_DECL && decl_function_context (t))
+ else if (TREE_CODE (t) == VAR_DECL && decl_function_context (t)
+ && !TREE_STATIC (t))
return false;
else
return (TYPE_P (t) || DECL_P (t) || TREE_CODE (t) == SSA_NAME);
@@ -694,7 +695,8 @@ lto_output_tree_ref (struct output_block *ob, tree expr)
case VAR_DECL:
case DEBUG_EXPR_DECL:
- gcc_assert (decl_function_context (expr) == NULL);
+ gcc_assert (decl_function_context (expr) == NULL
+ || TREE_STATIC (expr));
output_record_start (ob, LTO_global_decl_ref);
lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
break;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b97694b..0debb44 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2009-12-19 Richard Guenther <rguenther@suse.de>
+ PR lto/42401
+ * g++.dg/lto/20091219_0.C: New testcase.
+
+2009-12-19 Richard Guenther <rguenther@suse.de>
+
PR tree-optimization/42108
* gfortran.dg/pr42108.f90: New testcase.
diff --git a/gcc/testsuite/g++.dg/lto/20091219_0.C b/gcc/testsuite/g++.dg/lto/20091219_0.C
new file mode 100644
index 0000000..b76a95a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/20091219_0.C
@@ -0,0 +1,17 @@
+// { dg-lto-do run }
+// { dg-lto-options {{-O3 -flto}} }
+
+#include <string>
+#include <map>
+
+int main ()
+{
+ typedef std::map<int, std::string> Map;
+ static Map m;
+
+ Map::const_iterator it = m.find(0);
+ if (it != m.end())
+ std::string s = it->second;
+
+ return 0;
+}