aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-fold.c
diff options
context:
space:
mode:
authorMartin Sebor <msebor@redhat.com>2017-06-16 20:52:03 +0000
committerMartin Sebor <msebor@gcc.gnu.org>2017-06-16 14:52:03 -0600
commitb3d8d88efa4d8467d3b0657cc8a4a3e1913d939c (patch)
tree47083e874bec3afb22da189b754fb2bf2cfc4b5b /gcc/gimple-fold.c
parentaa11163b181893ed79dc1c75547b0109b342372e (diff)
downloadgcc-b3d8d88efa4d8467d3b0657cc8a4a3e1913d939c.zip
gcc-b3d8d88efa4d8467d3b0657cc8a4a3e1913d939c.tar.gz
gcc-b3d8d88efa4d8467d3b0657cc8a4a3e1913d939c.tar.bz2
PR tree-optimization/80934 - bzero should be assumed not to escape pointer argument
PR tree-optimization/80934 - bzero should be assumed not to escape pointer argument PR tree-optimization/80933 - redundant bzero/bcopy calls not eliminated gcc/ChangeLog: PR tree-optimization/80933 PR tree-optimization/80934 * builtins.c (fold_builtin_3): Do not handle bcmp here. * gimple-fold.c (gimple_fold_builtin_bcmp): New function. (gimple_fold_builtin_bcopy, gimple_fold_builtin_bzero): Likewise. (gimple_fold_builtin): Call them. gcc/testsuite/ChangeLog: PR tree-optimization/80933 PR tree-optimization/80934 * gcc.dg/fold-bcopy.c: New test. * gcc.dg/tree-ssa/ssa-dse-30.c: Likewise.. * gcc.dg/tree-ssa/alias-36.c: Likewise. * gcc/testsuite/gcc.dg/pr79214.c: Adjust. * gcc.dg/tree-prof/val-prof-7.c: Likewise. * gcc.dg/Wsizeof-pointer-memaccess1.c: Likewise. * gcc.dg/builtins-nonnull.c: Likewise. From-SVN: r249278
Diffstat (limited to 'gcc/gimple-fold.c')
-rw-r--r--gcc/gimple-fold.c88
1 files changed, 83 insertions, 5 deletions
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index 0f8e326..a00c2c8 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -1077,6 +1077,83 @@ done:
return true;
}
+/* Transform a call to built-in bcmp(a, b, len) at *GSI into one
+ to built-in memcmp (a, b, len). */
+
+static bool
+gimple_fold_builtin_bcmp (gimple_stmt_iterator *gsi)
+{
+ tree fn = builtin_decl_implicit (BUILT_IN_MEMCMP);
+
+ if (!fn)
+ return false;
+
+ /* Transform bcmp (a, b, len) into memcmp (a, b, len). */
+
+ gimple *stmt = gsi_stmt (*gsi);
+ tree a = gimple_call_arg (stmt, 0);
+ tree b = gimple_call_arg (stmt, 1);
+ tree len = gimple_call_arg (stmt, 2);
+
+ gimple *repl = gimple_build_call (fn, 3, a, b, len);
+ replace_call_with_call_and_fold (gsi, repl);
+
+ return true;
+}
+
+/* Transform a call to built-in bcopy (src, dest, len) at *GSI into one
+ to built-in memmove (dest, src, len). */
+
+static bool
+gimple_fold_builtin_bcopy (gimple_stmt_iterator *gsi)
+{
+ tree fn = builtin_decl_implicit (BUILT_IN_MEMMOVE);
+
+ if (!fn)
+ return false;
+
+ /* bcopy has been removed from POSIX in Issue 7 but Issue 6 specifies
+ it's quivalent to memmove (not memcpy). Transform bcopy (src, dest,
+ len) into memmove (dest, src, len). */
+
+ gimple *stmt = gsi_stmt (*gsi);
+ tree src = gimple_call_arg (stmt, 0);
+ tree dest = gimple_call_arg (stmt, 1);
+ tree len = gimple_call_arg (stmt, 2);
+
+ gimple *repl = gimple_build_call (fn, 3, dest, src, len);
+ gimple_call_set_fntype (as_a <gcall *> (stmt), TREE_TYPE (fn));
+ replace_call_with_call_and_fold (gsi, repl);
+
+ return true;
+}
+
+/* Transform a call to built-in bzero (dest, len) at *GSI into one
+ to built-in memset (dest, 0, len). */
+
+static bool
+gimple_fold_builtin_bzero (gimple_stmt_iterator *gsi)
+{
+ tree fn = builtin_decl_implicit (BUILT_IN_MEMSET);
+
+ if (!fn)
+ return false;
+
+ /* Transform bzero (dest, len) into memset (dest, 0, len). */
+
+ gimple *stmt = gsi_stmt (*gsi);
+ tree dest = gimple_call_arg (stmt, 0);
+ tree len = gimple_call_arg (stmt, 1);
+
+ gimple_seq seq = NULL;
+ gimple *repl = gimple_build_call (fn, 3, dest, integer_zero_node, len);
+ gimple_seq_add_stmt_without_update (&seq, repl);
+ gsi_replace_with_seq_vops (gsi, seq);
+ fold_stmt (gsi);
+
+ return true;
+}
+
/* Fold function call to builtin memset or bzero at *GSI setting the
memory of size LEN to VAL. Return whether a simplification was made. */
@@ -3288,16 +3365,17 @@ gimple_fold_builtin (gimple_stmt_iterator *gsi)
enum built_in_function fcode = DECL_FUNCTION_CODE (callee);
switch (fcode)
{
+ case BUILT_IN_BCMP:
+ return gimple_fold_builtin_bcmp (gsi);
+ case BUILT_IN_BCOPY:
+ return gimple_fold_builtin_bcopy (gsi);
case BUILT_IN_BZERO:
- return gimple_fold_builtin_memset (gsi, integer_zero_node,
- gimple_call_arg (stmt, 1));
+ return gimple_fold_builtin_bzero (gsi);
+
case BUILT_IN_MEMSET:
return gimple_fold_builtin_memset (gsi,
gimple_call_arg (stmt, 1),
gimple_call_arg (stmt, 2));
- case BUILT_IN_BCOPY:
- return gimple_fold_builtin_memory_op (gsi, gimple_call_arg (stmt, 1),
- gimple_call_arg (stmt, 0), 3);
case BUILT_IN_MEMCPY:
return gimple_fold_builtin_memory_op (gsi, gimple_call_arg (stmt, 0),
gimple_call_arg (stmt, 1), 0);