aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2017-11-28 11:58:45 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2017-11-28 11:58:45 +0000
commitd725717165707b49ee2484e462bbb7fbd278b919 (patch)
treefbb6ac2e0acaeb635b3ab0940c55b3874cea45b4 /gcc
parentfa69d74bd841dd75bd235f482b335e4c474ad3d5 (diff)
downloadgcc-d725717165707b49ee2484e462bbb7fbd278b919.zip
gcc-d725717165707b49ee2484e462bbb7fbd278b919.tar.gz
gcc-d725717165707b49ee2484e462bbb7fbd278b919.tar.bz2
re PR tree-optimization/83141 (SRA and memcpy folding interact badly generating wrong-code)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/gimple-fold.c18
2 files changed, 24 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a86c833..e83d8d2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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>
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index 353a46e..849b62f 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -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)