From cbf8d355b8ea5cdbbc02ac0ab0433aaa79431a3b Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Fri, 13 Jul 2007 15:41:02 +0000 Subject: [PATCH] re PR tree-optimization/32721 (CCP removes volatile qualifiers.) 2007-07-13 Richard Guenther PR tree-optimization/32721 * tree-ssa-ccp.c (maybe_fold_stmt_indirect): Preserve TREE_THIS_VOLATILE on the folded reference. * tree-ssa-operands.c (get_expr_operands): Set has_volatile_ops if the array reference has TREE_THIS_VOLATILE set. * gcc.dg/pr32721.c: New testcase. From-SVN: r126624 --- gcc/ChangeLog | 8 ++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr32721.c | 18 ++++++++++++++++++ gcc/tree-ssa-ccp.c | 6 +++++- gcc/tree-ssa-operands.c | 3 +++ 5 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr32721.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 49d10e0d5a7..5c8b8bed07b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2007-07-13 Richard Guenther + + PR tree-optimization/32721 + * tree-ssa-ccp.c (maybe_fold_stmt_indirect): Preserve + TREE_THIS_VOLATILE on the folded reference. + * tree-ssa-operands.c (get_expr_operands): Set has_volatile_ops + if the array reference has TREE_THIS_VOLATILE set. + 2007-07-13 H.J. Lu PR other/32188 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 666adc27304..469fe0f2dfe 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-07-13 Richard Guenther + + PR tree-optimization/32721 + * gcc.dg/pr32721.c: New testcase. + 2007-07-13 Hans-Peter Nilsson * gcc.dg/20011127-1.c: Use dg-message, not dg-error to match the diff --git a/gcc/testsuite/gcc.dg/pr32721.c b/gcc/testsuite/gcc.dg/pr32721.c new file mode 100644 index 00000000000..392937ebbf6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr32721.c @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +int spinlock[2]; +int main () +{ +volatile int * spinlock0; +volatile int * spinlock1; +spinlock0 = &spinlock[0]; +spinlock1 = &spinlock[1]; + +*spinlock0 = 0; +*spinlock1 = 0; + while (*spinlock0); +} + +/* { dg-final { scan-tree-dump "= spinlock.0." "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c index 272a4f85741..93345a99ccc 100644 --- a/gcc/tree-ssa-ccp.c +++ b/gcc/tree-ssa-ccp.c @@ -1839,6 +1839,7 @@ static tree maybe_fold_stmt_indirect (tree expr, tree base, tree offset) { tree t; + bool volatile_p = TREE_THIS_VOLATILE (expr); /* We may well have constructed a double-nested PLUS_EXPR via multiple substitutions. Fold that down to one. Remove NON_LVALUE_EXPRs that @@ -1882,7 +1883,10 @@ maybe_fold_stmt_indirect (tree expr, tree base, tree offset) t = maybe_fold_offset_to_reference (base_addr, offset, TREE_TYPE (expr)); if (t) - return t; + { + TREE_THIS_VOLATILE (t) = volatile_p; + return t; + } } else { diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c index 1e9dde7e327..b0c3b9589b8 100644 --- a/gcc/tree-ssa-operands.c +++ b/gcc/tree-ssa-operands.c @@ -2078,6 +2078,9 @@ get_expr_operands (tree stmt, tree *expr_p, int flags) if (!none) flags |= opf_no_vops; + + if (TREE_THIS_VOLATILE (expr)) + get_stmt_ann (stmt)->has_volatile_ops = true; } else if (TREE_CODE (ref) == INDIRECT_REF) {