Hi!

When cp_fold is called on INDIRECT_REF and ARRAY*_REF and any of the
arguments change in the recursive calls, we fail to copy TREE_THIS_VOLATILE
flag.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk/6.2?

2016-06-02  Jakub Jelinek  <ja...@redhat.com>

        PR c++/71372
        * cp-gimplify.c (cp_fold): For INDIRECT_REF, if the folded expression
        is INDIRECT_REF or MEM_REF, copy over TREE_READONLY, TREE_SIDE_EFFECTS
        and TREE_THIS_VOLATILE flags.  For ARRAY_REF and ARRAY_RANGE_REF, copy
        over TREE_READONLY, TREE_SIDE_EFFECTS and TREE_THIS_VOLATILE flags
        to the newly built tree.

        * c-c++-common/pr71372.c: New test.

--- gcc/cp/cp-gimplify.c.jj     2016-05-26 10:38:01.000000000 +0200
+++ gcc/cp/cp-gimplify.c        2016-06-02 10:21:33.903655321 +0200
@@ -2035,7 +2035,16 @@ cp_fold (tree x)
          if (op0 == error_mark_node)
            x = error_mark_node;
          else
-           x = fold_build1_loc (loc, code, TREE_TYPE (x), op0);
+           {
+             x = fold_build1_loc (loc, code, TREE_TYPE (x), op0);
+             if (code == INDIRECT_REF
+                 && (INDIRECT_REF_P (x) || TREE_CODE (x) == MEM_REF))
+               {
+                 TREE_READONLY (x) = TREE_READONLY (org_x);
+                 TREE_SIDE_EFFECTS (x) = TREE_SIDE_EFFECTS (org_x);
+                 TREE_THIS_VOLATILE (x) = TREE_THIS_VOLATILE (org_x);
+               }
+           }
        }
       else
        x = fold (x);
@@ -2312,7 +2321,12 @@ cp_fold (tree x)
              || op3 == error_mark_node)
            x = error_mark_node;
          else
-           x = build4_loc (loc, code, TREE_TYPE (x), op0, op1, op2, op3);
+           {
+             x = build4_loc (loc, code, TREE_TYPE (x), op0, op1, op2, op3);
+             TREE_READONLY (x) = TREE_READONLY (org_x);
+             TREE_SIDE_EFFECTS (x) = TREE_SIDE_EFFECTS (org_x);
+             TREE_THIS_VOLATILE (x) = TREE_THIS_VOLATILE (org_x);
+           }
        }
 
       x = fold (x);
--- gcc/testsuite/c-c++-common/pr71372.c.jj     2016-06-02 10:53:40.994678549 
+0200
+++ gcc/testsuite/c-c++-common/pr71372.c        2016-06-02 10:53:04.000000000 
+0200
@@ -0,0 +1,14 @@
+/* PR c++/71372 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+void
+foo (volatile int *p, int q)
+{
+  *(volatile int *)p = 0;
+  *(p + (q - q) + 1) = 0;
+  *(p + (q - q) + 2) = 0;
+  *(p + (q - q) + 3) = 0;
+}
+
+/* { dg-final { scan-tree-dump-times " ={v} " 4 "optimized" } } */

        Jakub

Reply via email to