From 2f159d9f86705209595b1b8de719231c2f5fae33 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Tue, 3 Mar 2015 04:54:49 -0700 Subject: [PATCH] re PR tree-optimization/65241 (ICE (in remove_local_expressions_from_table, at tree-ssa-dom.c:1081)) PR tree-optimization/65241 * tree-ssa-dom.c (lookup_avail_expr): Only modify the avail_expr hash table if INSERT is true. PR tree-optimization/65241 * gcc.c-torture/compile/pr65241.c: New test. From-SVN: r221145 --- gcc/ChangeLog | 6 +++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.c-torture/compile/pr65241.c | 26 ++++++++++++++++++ gcc/tree-ssa-dom.c | 27 ++++++++++--------- 4 files changed, 52 insertions(+), 12 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr65241.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 55c106c3f76..cb42917f610 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-03-23 Jeff Law + + PR tree-optimization/65241 + * tree-ssa-dom.c (lookup_avail_expr): Only modify the avail_expr + hash table if INSERT is true. + 2015-03-03 Georg-Johann Lay PR target/65296 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ecc4cc42b31..824d2561fea 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-03-13 Jeff Law + + PR tree-optimization/65241 + * gcc.c-torture/compile/pr65241.c: New test. + 2015-03-03 Georg-Johann Lay PR target/64331 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr65241.c b/gcc/testsuite/gcc.c-torture/compile/pr65241.c new file mode 100644 index 00000000000..dd76ac53098 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr65241.c @@ -0,0 +1,26 @@ +enum E { A, B, C, D }; +void fn4 (void); + +int +fn1 (enum E p1) +{ + static int w[D]; + if (w[p1]) + switch (p1) + case C: + w[p1] = 0; +} + +void +fn2 (p1) +{ + fn1 (p1); +} + +void +fn3 (enum E p1) +{ + fn2 (p1); + fn4 (); + fn2 (p1); +} diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index 096e4712675..d230ce1c7b3 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -2649,19 +2649,22 @@ lookup_avail_expr (gimple stmt, bool insert) && walk_non_aliased_vuses (&ref, vuse2, vuse_eq, NULL, NULL, vuse1) != NULL)) { - struct expr_hash_elt *element2 = XNEW (struct expr_hash_elt); - *element2 = element; - element2->stamp = element2; - - /* Insert the expr into the hash by replacing the current - entry and recording the value to restore in the - aval_exprs_stack. */ - avail_exprs_stack.safe_push (std::make_pair (element2, *slot)); - *slot = element2; - if (dump_file && (dump_flags & TDF_DETAILS)) + if (insert) { - fprintf (dump_file, "2>>> "); - print_expr_hash_elt (dump_file, *slot); + struct expr_hash_elt *element2 = XNEW (struct expr_hash_elt); + *element2 = element; + element2->stamp = element2; + + /* Insert the expr into the hash by replacing the current + entry and recording the value to restore in the + avail_exprs_stack. */ + avail_exprs_stack.safe_push (std::make_pair (element2, *slot)); + *slot = element2; + if (dump_file && (dump_flags & TDF_DETAILS)) + { + fprintf (dump_file, "2>>> "); + print_expr_hash_elt (dump_file, *slot); + } } return NULL_TREE; } -- 2.30.2