]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/83141 (SRA and memcpy folding interact badly generating wrong...
authorRichard Biener <rguenther@suse.de>
Tue, 28 Nov 2017 11:58:45 +0000 (11:58 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 28 Nov 2017 11:58:45 +0000 (11:58 +0000)
2017-11-28  Richard Biener  <rguenther@suse.de>

PR middle-end/83141
* gimple-fold.c (gimple_fold_builtin_memory_op): For aggregate
copies generated from memcpy use a character array as reference
type.

From-SVN: r255197

gcc/ChangeLog
gcc/gimple-fold.c

index a86c833d4bb05e6804e56d95a6e8e7154e814395..e83d8d239b6cd858dcb3ed0559ac12ff89db16ed 100644 (file)
@@ -1,3 +1,10 @@
+2017-11-28  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/83141
+       * gimple-fold.c (gimple_fold_builtin_memory_op): For aggregate
+       copies generated from memcpy use a character array as reference
+       type.
+
 2017-11-28  Julia Koval  <julia.koval@intel.com>
             Sebastian Peryt  <sebastian.peryt@intel.com>
 
index 353a46ed1b77490346dd48d0c54f76a890c5bbbc..849b62fa903d8c2fc45a5d822fc35fd42d2d4390 100644 (file)
@@ -1039,8 +1039,24 @@ gimple_fold_builtin_memory_op (gimple_stmt_iterator *gsi,
              gimple_set_vuse (new_stmt, gimple_vuse (stmt));
              gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT);
            }
+         new_stmt = gimple_build_assign (destvar, srcvar);
+         goto set_vop_and_replace;
        }
-      new_stmt = gimple_build_assign (destvar, srcvar);
+
+      /* We get an aggregate copy.  Use an unsigned char[] type to
+        perform the copying to preserve padding and to avoid any issues
+        with TREE_ADDRESSABLE types or float modes behavior on copying.  */
+      desttype = build_array_type_nelts (unsigned_char_type_node,
+                                        tree_to_uhwi (len));
+      srctype = desttype;
+      if (src_align > TYPE_ALIGN (srctype))
+       srctype = build_aligned_type (srctype, src_align);
+      if (dest_align > TYPE_ALIGN (desttype))
+       desttype = build_aligned_type (desttype, dest_align);
+      new_stmt
+       = gimple_build_assign (fold_build2 (MEM_REF, desttype, dest, off0),
+                              fold_build2 (MEM_REF, srctype, src, off0));
+set_vop_and_replace:
       gimple_set_vuse (new_stmt, gimple_vuse (stmt));
       gimple_set_vdef (new_stmt, gimple_vdef (stmt));
       if (gimple_vdef (new_stmt)