re PR tree-optimization/56396 (memory corruption in cc1)
authorRichard Biener <rguenther@suse.de>
Wed, 20 Feb 2013 11:39:39 +0000 (11:39 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 20 Feb 2013 11:39:39 +0000 (11:39 +0000)
2013-02-20  Richard Biener  <rguenther@suse.de>
Jakub Jelinek  <jakub@redhat.com>

PR tree-optimization/56396
* tree-ssa-ccp.c (n_const_val): New static variable.
(get_value): Return NULL for SSA names we don't have a lattice
entry for.
(ccp_initialize): Initialize n_const_val.
* tree-ssa-copy.c (n_copy_of): New static variable.
(init_copy_prop): Initialize n_copy_of.
(get_value): Return NULL_TREE for SSA names we don't have a
lattice entry for.

* gcc.dg/pr56396.c: New testcase.

Co-Authored-By: Jakub Jelinek <jakub@redhat.com>
From-SVN: r196170

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr56396.c [new file with mode: 0644]
gcc/tree-ssa-ccp.c
gcc/tree-ssa-copy.c

index 7f9b13f47ee8f692d9903d67abf036d5da257595..5e18a6c5ad6a4aa3ceac12defbf76e2a3bdced1c 100644 (file)
@@ -1,3 +1,16 @@
+2013-02-20  Richard Biener  <rguenther@suse.de>
+       Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/56396
+       * tree-ssa-ccp.c (n_const_val): New static variable.
+       (get_value): Return NULL for SSA names we don't have a lattice
+       entry for.
+       (ccp_initialize): Initialize n_const_val.
+       * tree-ssa-copy.c (n_copy_of): New static variable.
+       (init_copy_prop): Initialize n_copy_of.
+       (get_value): Return NULL_TREE for SSA names we don't have a
+       lattice entry for.
+
 2013-02-20  Martin Jambor  <mjambor@suse.cz>
 
        * ipa-cp.c (initialize_node_lattices): Fix dumping condition.
index 0135609ad3b2c14cfbbc3f2e1bd29ff42175c7bf..838de3c15c3a467a5dee6d2d80df53620b774de3 100644 (file)
@@ -1,3 +1,9 @@
+2013-02-20  Richard Biener  <rguenther@suse.de>
+       Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/56396
+       * gcc.dg/pr56396.c: New testcase.
+
 2013-02-20  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/56373
diff --git a/gcc/testsuite/gcc.dg/pr56396.c b/gcc/testsuite/gcc.dg/pr56396.c
new file mode 100644 (file)
index 0000000..d2ec8fa
--- /dev/null
@@ -0,0 +1,22 @@
+/* PR tree-optimization/56396 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fpic -g" } */
+
+struct S { char *s; int z; };
+struct T { int t; } *c, u;
+void bar (int, const char *);
+
+inline void *
+foo (void *x, char *y, int z)
+{
+  struct S s;
+  char b[256];
+  s.s = b;
+  s.z = __builtin___sprintf_chk (s.s, 1, __builtin_object_size (s.s, 2), "Require");
+  if (s.z < 0)
+    bar (u.t | c->t, "rls");
+  if (foo (x, s.s, s.z))
+    {
+    }
+  return (void *) 0;
+}
index d8f03a1a34319793e5638a9027777220dcdbf818..b4faded0b509fa929baa6ed964480aacdc78fa6c 100644 (file)
@@ -162,6 +162,7 @@ typedef struct prop_value_d prop_value_t;
    memory reference used to store (i.e., the LHS of the assignment
    doing the store).  */
 static prop_value_t *const_val;
+static unsigned n_const_val;
 
 static void canonicalize_float_value (prop_value_t *);
 static bool ccp_fold_stmt (gimple_stmt_iterator *);
@@ -295,7 +296,8 @@ get_value (tree var)
 {
   prop_value_t *val;
 
-  if (const_val == NULL)
+  if (const_val == NULL
+      || SSA_NAME_VERSION (var) >= n_const_val)
     return NULL;
 
   val = &const_val[SSA_NAME_VERSION (var)];
@@ -713,7 +715,8 @@ ccp_initialize (void)
 {
   basic_block bb;
 
-  const_val = XCNEWVEC (prop_value_t, num_ssa_names);
+  n_const_val = num_ssa_names;
+  const_val = XCNEWVEC (prop_value_t, n_const_val);
 
   /* Initialize simulation flags for PHI nodes and statements.  */
   FOR_EACH_BB (bb)
index 551ebe3f0ede5c6c22ca3359b4373294857f1f4d..75a415454def12f59217a01628450285fa53b69c 100644 (file)
@@ -280,6 +280,7 @@ struct prop_value_d {
 typedef struct prop_value_d prop_value_t;
 
 static prop_value_t *copy_of;
+static unsigned n_copy_of;
 
 
 /* Return true if this statement may generate a useful copy.  */
@@ -664,7 +665,8 @@ init_copy_prop (void)
 {
   basic_block bb;
 
-  copy_of = XCNEWVEC (prop_value_t, num_ssa_names);
+  n_copy_of = num_ssa_names;
+  copy_of = XCNEWVEC (prop_value_t, n_copy_of);
 
   FOR_EACH_BB (bb)
     {
@@ -728,7 +730,10 @@ init_copy_prop (void)
 static tree
 get_value (tree name)
 {
-  tree val = copy_of[SSA_NAME_VERSION (name)].value;
+  tree val;
+  if (SSA_NAME_VERSION (name) >= n_copy_of)
+    return NULL_TREE;
+  val = copy_of[SSA_NAME_VERSION (name)].value;
   if (val && val != name)
     return val;
   return NULL_TREE;