Commit af62f6f9 by Richard Henderson Committed by Richard Henderson

re PR tree-optimization/22278 (gcc -O2 discards cast to volatile)

        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
parent b9b8dde3
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> 2005-07-15 DJ Delorie <dj@redhat.com>
* toplev.h: Add comment about the first parameter for warning(). * toplev.h: Add comment about the first parameter for warning().
......
...@@ -4411,8 +4411,9 @@ gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p, ...@@ -4411,8 +4411,9 @@ gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
{ {
/* Historically, the compiler has treated a bare /* Historically, the compiler has treated a bare
reference to a volatile lvalue as forcing a load. */ reference to a volatile lvalue as forcing a load. */
tree tmp = create_tmp_var (TREE_TYPE (*expr_p), "vol"); tree type = TYPE_MAIN_VARIANT (TREE_TYPE (*expr_p));
*expr_p = build (MODIFY_EXPR, TREE_TYPE (tmp), tmp, *expr_p); tree tmp = create_tmp_var (type, "vol");
*expr_p = build (MODIFY_EXPR, type, tmp, *expr_p);
} }
else else
/* We can't do anything useful with a volatile reference to /* We can't do anything useful with a volatile reference to
......
...@@ -903,6 +903,15 @@ tree_ssa_useless_type_conversion_1 (tree outer_type, tree inner_type) ...@@ -903,6 +903,15 @@ tree_ssa_useless_type_conversion_1 (tree outer_type, tree inner_type)
&& TREE_CODE (TREE_TYPE (outer_type)) == VOID_TYPE) && TREE_CODE (TREE_TYPE (outer_type)) == VOID_TYPE)
return true; 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 /* Pointers/references are equivalent if their pointed to types
are effectively the same. This allows to strip conversions between are effectively the same. This allows to strip conversions between
pointer types with different type qualifiers. */ pointer types with different type qualifiers. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment