From aad88aede922888994eda29d6847cf557b50a7fd Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 5 Aug 2015 12:47:59 +0000 Subject: [PATCH] re PR middle-end/67120 (wrong code for volatile pointers at -O1 and above on x86_64-linux-gnu) 2015-08-05 Richard Biener PR middle-end/67120 * match.pd: Compare address bases with == if they are decls or SSA names, not operand_equal_p. Otherwise fail. * gcc.dg/torture/pr67120.c: New testcase. From-SVN: r226623 --- gcc/ChangeLog | 6 ++++++ gcc/match.pd | 7 ++++--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr67120.c | 16 ++++++++++++++++ 4 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr67120.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ff02e19..349bbcb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2015-08-05 Richard Biener + PR middle-end/67120 + * match.pd: Compare address bases with == if they are decls + or SSA names, not operand_equal_p. Otherwise fail. + +2015-08-05 Richard Biener + PR tree-optimization/67055 * tree-ssa-ccp.c (fold_builtin_alloca_with_align): Handle NULL gimple_block. diff --git a/gcc/match.pd b/gcc/match.pd index 2a4f7d6..4230f9a 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -1848,13 +1848,14 @@ along with GCC; see the file COPYING3. If not see (if (base0 && base1) (with { - int equal; + int equal = 2; if (decl_in_symtab_p (base0) && decl_in_symtab_p (base1)) equal = symtab_node::get_create (base0) ->equal_address_to (symtab_node::get_create (base1)); - else - equal = operand_equal_p (base0, base1, 0); + else if ((DECL_P (base0) || TREE_CODE (base0) == SSA_NAME) + && (DECL_P (base1) || TREE_CODE (base1) == SSA_NAME)) + equal = (base0 == base1); } (if (equal == 1 && (cmp == EQ_EXPR || cmp == NE_EXPR diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d1bb135..61d9848 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-08-05 Richard Biener + + PR middle-end/67120 + * gcc.dg/torture/pr67120.c: New testcase. + 2015-08-05 Paul Thomas PR fortran/52846 diff --git a/gcc/testsuite/gcc.dg/torture/pr67120.c b/gcc/testsuite/gcc.dg/torture/pr67120.c new file mode 100644 index 0000000..d22b314 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr67120.c @@ -0,0 +1,16 @@ +/* { dg-do run } */ + +volatile int *volatile *a; +static volatile int *volatile **b = &a; + +int +main () +{ + volatile int *volatile c; + *b = &c; + + if (a != &c) + __builtin_abort (); + + return 0; +} -- 2.7.4