re PR tree-optimization/22278 (gcc -O2 discards cast to volatile)
authorRichard Henderson <rth@redhat.com>
Tue, 19 Jul 2005 20:20:40 +0000 (13:20 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Tue, 19 Jul 2005 20:20:40 +0000 (13:20 -0700)
        PR tree-opt/22278
        * gimplify.c (gimplify_expr): Use main variant type for the temp
        destination for a discarded volatile read.
        * tree-ssa.c (tree_ssa_useless_type_conversion_1): Don't elide
        casts between non-void types that change volatility.

From-SVN: r102169

gcc/ChangeLog
gcc/gimplify.c
gcc/tree-ssa.c

index ec8a08eef0b08cc13e6f43bff86a8b7bc29a9335..d411fc276b3df4c12cb8869884266f611378ac58 100644 (file)
@@ -1,3 +1,11 @@
+2005-07-19  Richard Henderson  <rth@redhat.com>
+
+       PR tree-opt/22278
+       * gimplify.c (gimplify_expr): Use main variant type for the temp
+       destination for a discarded volatile read.
+       * tree-ssa.c (tree_ssa_useless_type_conversion_1): Don't elide
+       casts between non-void types that change volatility.
+
 2005-07-15  DJ Delorie  <dj@redhat.com>
 
        * toplev.h: Add comment about the first parameter for warning().
index 13cf0267fc350eb938c25523ace3e3bae4e27500..3f06d7a0491551da8d8af2d2ffdcbfc2896d3ed5 100644 (file)
@@ -4411,8 +4411,9 @@ gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
        {
          /* Historically, the compiler has treated a bare
             reference to a volatile lvalue as forcing a load.  */
-         tree tmp = create_tmp_var (TREE_TYPE (*expr_p), "vol");
-         *expr_p = build (MODIFY_EXPR, TREE_TYPE (tmp), tmp, *expr_p);
+         tree type = TYPE_MAIN_VARIANT (TREE_TYPE (*expr_p));
+         tree tmp = create_tmp_var (type, "vol");
+         *expr_p = build (MODIFY_EXPR, type, tmp, *expr_p);
        }
       else
        /* We can't do anything useful with a volatile reference to
index fc1754f65ff6ae876c70f57c4cb34deae5411fc1..d78a944209e12843b065ae46967ba7e51df75e40 100644 (file)
@@ -903,6 +903,15 @@ tree_ssa_useless_type_conversion_1 (tree outer_type, tree inner_type)
           && TREE_CODE (TREE_TYPE (outer_type)) == VOID_TYPE)
     return true;
 
+  /* Don't lose casts between pointers to volatile and non-volatile
+     qualified types.  Doing so would result in changing the semantics
+     of later accesses.  */
+  else if (POINTER_TYPE_P (inner_type)
+           && POINTER_TYPE_P (outer_type)
+          && TYPE_VOLATILE (TREE_TYPE (outer_type))
+             != TYPE_VOLATILE (TREE_TYPE (inner_type)))
+    return false;
+
   /* Pointers/references are equivalent if their pointed to types
      are effectively the same.  This allows to strip conversions between
      pointer types with different type qualifiers.  */