tree-sra.c (sra_build_assignment): Handle CONVERT_EXPR_P dst.
authorJakub Jelinek <jakub@redhat.com>
Tue, 8 Jul 2008 16:34:37 +0000 (18:34 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 8 Jul 2008 16:34:37 +0000 (18:34 +0200)
* tree-sra.c (sra_build_assignment): Handle CONVERT_EXPR_P
dst.

From-SVN: r137633

gcc/ChangeLog
gcc/tree-sra.c

index e88d5d3c3d34f37791e0a01e7750c484bb86cd72..b93a55d879d2978d53752cb85be2c26e97c8f2f4 100644 (file)
@@ -1,3 +1,8 @@
+2008-07-08  Jakub Jelinek  <jakub@redhat.com>
+
+       * tree-sra.c (sra_build_assignment): Handle CONVERT_EXPR_P
+       dst.
+
 2008-07-05  Daniel Berlin  <dberlin@dberlin.org>
        
        Fix PR tree-optimization/23455
index c50c6cd225bfee00e6f25af585a415d9e88f2cfa..16f719e5ecb2b2471f077304f22841e352d41a50 100644 (file)
@@ -2282,6 +2282,9 @@ sra_build_assignment (tree dst, tree src)
          var = utmp;
        }
 
+      /* fold_build3 (BIT_FIELD_REF, ...) sometimes returns a cast.  */
+      STRIP_NOPS (dst);
+
       /* Finally, move and convert to the destination.  */
       if (!useless_type_conversion_p (TREE_TYPE (dst), TREE_TYPE (var)))
        {
@@ -2306,6 +2309,12 @@ sra_build_assignment (tree dst, tree src)
       return list;
     }
 
+  /* fold_build3 (BIT_FIELD_REF, ...) sometimes returns a cast.  */
+  if (CONVERT_EXPR_P (dst))
+    {
+      STRIP_NOPS (dst);
+      src = fold_convert (TREE_TYPE (dst), src);
+    }
   /* It was hoped that we could perform some type sanity checking
      here, but since front-ends can emit accesses of fields in types
      different from their nominal types and copy structures containing
@@ -2316,8 +2325,8 @@ sra_build_assignment (tree dst, tree src)
      So we just assume type differences at this point are ok.
      The only exception we make here are pointer types, which can be different
      in e.g. structurally equal, but non-identical RECORD_TYPEs.  */
-  if (POINTER_TYPE_P (TREE_TYPE (dst))
-      && !useless_type_conversion_p (TREE_TYPE (dst), TREE_TYPE (src)))
+  else if (POINTER_TYPE_P (TREE_TYPE (dst))
+          && !useless_type_conversion_p (TREE_TYPE (dst), TREE_TYPE (src)))
     src = fold_convert (TREE_TYPE (dst), src);
 
   return build_gimple_modify_stmt (dst, src);