Hi,

at the moment, the only check in SRA for volatility is of the DECLs
themselves.  As PR 63375 shows, there can be volatile references to a
non-volatile declaration which must not be ignored, otherwise SRA can
loose the volatility of the reference.  Since the point of SRA is to
produce unaddressable scalars, I decided to simply ignore aggregates
accessed through volatile references, which is done by the patch
below.

Note that the patch alone does not fix the PR as we happen to make
some sort of similar mistake later on in the pipeline (see comment 4
in bugzilla).

Bootstrapped and tested on x86_64-linux.  OK for trunk and for the
maintained release branches after re-testing there?

Thanks,

Martin


2014-09-26  Martin Jambor  <mjam...@suse.cz>

        PR tree-optimization/63375
        * tree-sra.c (build_access_from_expr_1): Disqualify volatile
        references.

diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 8259dba..fb24114 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -1064,6 +1064,11 @@ build_access_from_expr_1 (tree expr, gimple stmt, bool 
write)
                               "component.");
       return NULL;
     }
+  if (TREE_THIS_VOLATILE (expr))
+    {
+      disqualify_base_of_expr (expr, "part of a volatile reference.");
+      return NULL;
+    }
 
   switch (TREE_CODE (expr))
     {

Reply via email to