In this PR, a cast to a volatile type is lost during forwprop1,
resulting in the wrong access semantics being used for a memory-mapped
peripheral register.  Checking for loss of volatile in this patch
solves the problem, but I don't know if this is the right place to put
such a test - it could go in tree-ssa-forwprop.c also, to be specific
to this bug.

Comments?

Index: tree-ssa.c
===================================================================
--- tree-ssa.c  (revision 176495)
+++ tree-ssa.c  (working copy)
@@ -1274,12 +1274,18 @@ useless_type_conversion_p (tree outer_ty
 
       /* If the outer type is (void *), the conversion is not necessary.  */
       if (VOID_TYPE_P (TREE_TYPE (outer_type)))
        return true;
     }
 
+  /* Do not lose casts to volatile qualified types.  */
+  if ((TYPE_VOLATILE (outer_type)
+       != TYPE_VOLATILE (inner_type))
+      && TYPE_VOLATILE (outer_type))
+    return false;
+
   /* From now on qualifiers on value types do not matter.  */
   inner_type = TYPE_MAIN_VARIANT (inner_type);
   outer_type = TYPE_MAIN_VARIANT (outer_type);
 
   if (inner_type == outer_type)
     return true;

Reply via email to