From: Richard Biener Date: Tue, 6 May 2014 14:22:41 +0000 (+0000) Subject: backport: re PR tree-optimization/57417 (hang on volatile int array) X-Git-Tag: releases/gcc-4.7.4~116 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cb8d7dad6485ff43bcca48cedbc7a6064080c792;p=thirdparty%2Fgcc.git backport: re PR tree-optimization/57417 (hang on volatile int array) 2014-05-06 Richard Biener Backport from mainline 2013-05-27 Richard Biener PR tree-optimization/57417 * tree-ssa-sccvn.c (set_ssa_val_to): Compare addresses using get_addr_base_and_unit_offset. * gcc.dg/torture/pr57417.c: New testcase. From-SVN: r210110 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a5390e67db0e..030f3ffcd74d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2014-05-06 Richard Biener + + Backport from mainline + 2013-05-27 Richard Biener + + PR tree-optimization/57417 + * tree-ssa-sccvn.c (set_ssa_val_to): Compare addresses using + get_addr_base_and_unit_offset. + 2014-04-25 Eric Botcazou PR target/60941 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e58454589f0a..6b5f1f576203 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2014-05-06 Richard Biener + + Backport from mainline + 2013-05-27 Richard Biener + + PR tree-optimization/57417 + * gcc.dg/torture/pr57417.c: New testcase. + 2014-04-25 Eric Botcazou * gcc.c-torture/execute/20140425-1.c: New test. diff --git a/gcc/testsuite/gcc.dg/torture/pr57417.c b/gcc/testsuite/gcc.dg/torture/pr57417.c new file mode 100644 index 000000000000..6eac6f932b81 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr57417.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ + +int a, b; +volatile int *c; + +void foo () +{ + volatile int d[1]; + b = 0; + for (;; a--) + c = &d[b]; +} diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index c2bd59d6416d..1e4dc14434d6 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -2483,6 +2483,7 @@ static inline bool set_ssa_val_to (tree from, tree to) { tree currval = SSA_VAL (from); + HOST_WIDE_INT toff, coff; if (from != to) { @@ -2518,7 +2519,17 @@ set_ssa_val_to (tree from, tree to) print_generic_expr (dump_file, to, 0); } - if (currval != to && !operand_equal_p (currval, to, OEP_PURE_SAME)) + if (currval != to + && !operand_equal_p (currval, to, OEP_PURE_SAME) + /* ??? For addresses involving volatile objects or types operand_equal_p + does not reliably detect ADDR_EXPRs as equal. We know we are only + getting invariant gimple addresses here, so can use + get_addr_base_and_unit_offset to do this comparison. */ + && !(TREE_CODE (currval) == ADDR_EXPR + && TREE_CODE (to) == ADDR_EXPR + && (get_addr_base_and_unit_offset (TREE_OPERAND (currval, 0), &coff) + == get_addr_base_and_unit_offset (TREE_OPERAND (to, 0), &toff)) + && coff == toff)) { VN_INFO (from)->valnum = to; if (dump_file && (dump_flags & TDF_DETAILS))