public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-2853] Adjust volatile handling of the operand scanner
@ 2021-08-11 14:24 Richard Biener
  0 siblings, 0 replies; only message in thread
From: Richard Biener @ 2021-08-11 14:24 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:e8426554e1375fec2d119ba9cc5feb263db84559

commit r12-2853-ge8426554e1375fec2d119ba9cc5feb263db84559
Author: Richard Biener <rguenther@suse.de>
Date:   Mon Aug 9 13:12:08 2021 +0200

    Adjust volatile handling of the operand scanner
    
    The GIMPLE SSA operand scanner handles COMPONENT_REFs that are
    not marked TREE_THIS_VOLATILE but have a TREE_THIS_VOLATILE
    FIELD_DECL as volatile.  That's inconsistent in how TREE_THIS_VOLATILE
    testing on GENERIC refs works which requires operand zero of
    component references to mirror TREE_THIS_VOLATILE to the ref
    so that testing TREE_THIS_VOLATILE on the outermost reference
    is enough to determine the volatileness.
    
    The following patch thus removes FIELD_DECL scanning from
    the GIMPLE SSA operand scanner, possibly leaving fewer stmts
    marked as gimple_has_volatile_ops.
    
    It shows we miss at least one case in the fortran frontend, though
    there's a suspicious amount of COMPONENT_REF creation compared
    to little setting of TREE_THIS_VOLATILE.  This fixes the FAIL
    of gfortran.dg/volatile11.f90 that would otherwise occur.
    
    Visually inspecting fortran/ reveals a bunch of likely to fix
    cases but I don't know the constraints of 'volatile' uses in
    the fortran language to assess whether some of these are not
    necessary.
    
    2021-08-09  Richard Biener  <rguenther@suse.de>
    
    gcc/
            * tree-ssa-operands.c (operands_scanner::get_expr_operands):
            Do not look at COMPONENT_REF FIELD_DECLs TREE_THIS_VOLATILE
            to determine has_volatile_ops.
    
    gcc/fortran/
            * trans-common.c (create_common): Set TREE_THIS_VOLATILE on the
            COMPONENT_REF if the field is volatile.

Diff:
---
 gcc/fortran/trans-common.c | 9 +++++----
 gcc/tree-ssa-operands.c    | 7 +------
 2 files changed, 6 insertions(+), 10 deletions(-)

diff --git a/gcc/fortran/trans-common.c b/gcc/fortran/trans-common.c
index a11cf4c839e..7bcf18dc475 100644
--- a/gcc/fortran/trans-common.c
+++ b/gcc/fortran/trans-common.c
@@ -759,10 +759,11 @@ create_common (gfc_common_head *com, segment_info *head, bool saw_equiv)
       else
 	gfc_add_decl_to_function (var_decl);
 
-      SET_DECL_VALUE_EXPR (var_decl,
-			   fold_build3_loc (input_location, COMPONENT_REF,
-					    TREE_TYPE (s->field),
-					    decl, s->field, NULL_TREE));
+      tree comp = build3_loc (input_location, COMPONENT_REF,
+			      TREE_TYPE (s->field), decl, s->field, NULL_TREE);
+      if (TREE_THIS_VOLATILE (s->field))
+	TREE_THIS_VOLATILE (comp) = 1;
+      SET_DECL_VALUE_EXPR (var_decl, comp);
       DECL_HAS_VALUE_EXPR_P (var_decl) = 1;
       GFC_DECL_COMMON_OR_EQUIV (var_decl) = 1;
 
diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c
index c15575416dd..ebf7eea3b04 100644
--- a/gcc/tree-ssa-operands.c
+++ b/gcc/tree-ssa-operands.c
@@ -834,12 +834,7 @@ operands_scanner::get_expr_operands (tree *expr_p, int flags)
 	get_expr_operands (&TREE_OPERAND (expr, 0), flags);
 
 	if (code == COMPONENT_REF)
-	  {
-	    if (!(flags & opf_no_vops)
-		&& TREE_THIS_VOLATILE (TREE_OPERAND (expr, 1)))
-	      gimple_set_has_volatile_ops (stmt, true);
-	    get_expr_operands (&TREE_OPERAND (expr, 2), uflags);
-	  }
+	  get_expr_operands (&TREE_OPERAND (expr, 2), uflags);
 	else if (code == ARRAY_REF || code == ARRAY_RANGE_REF)
 	  {
 	    get_expr_operands (&TREE_OPERAND (expr, 1), uflags);


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-08-11 14:24 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-11 14:24 [gcc r12-2853] Adjust volatile handling of the operand scanner Richard Biener

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).