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
This commit is contained in:
Richard Henderson 2005-07-19 13:20:40 -07:00 committed by Richard Henderson
parent b9b8dde302
commit af62f6f9a4
3 changed files with 20 additions and 2 deletions

View 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().

View 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

View 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. */