]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/114246 - invalid call argument from DSE
authorRichard Biener <rguenther@suse.de>
Wed, 6 Mar 2024 08:02:31 +0000 (09:02 +0100)
committerRichard Biener <rguenther@suse.de>
Mon, 6 May 2024 12:00:43 +0000 (14:00 +0200)
The following makes sure to strip type conversions added by
build_fold_addr_expr before placing the result in a call argument.

PR tree-optimization/114246
* tree-ssa-dse.cc (increment_start_addr): Strip useless
type conversions from the adjusted address.

* gcc.dg/torture/pr114246.c: New testcase.

(cherry picked from commit 0249744a9fe0775c2c895727aeebec4c59fd5f95)

gcc/testsuite/gcc.dg/torture/pr114246.c [new file with mode: 0644]
gcc/tree-ssa-dse.cc

diff --git a/gcc/testsuite/gcc.dg/torture/pr114246.c b/gcc/testsuite/gcc.dg/torture/pr114246.c
new file mode 100644 (file)
index 0000000..eb20db5
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-w" } */
+
+int a, b;
+
+void
+foo (void)
+{
+  __builtin_memcpy (&a, (char *)&b - 1, 2);
+  __builtin_memcpy (&a, &b, 1);
+}
index e28eb88068a2fbf378fd767d5a128b4cf861c637..779b518ff8001e349a1616f109a7ae259795492a 100644 (file)
@@ -48,6 +48,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "tree-ssa-loop-niter.h"
 #include "cfgloop.h"
 #include "tree-data-ref.h"
+#include "tree-ssa.h"
 
 /* This file implements dead store elimination.
 
@@ -643,6 +644,7 @@ increment_start_addr (gimple *stmt, tree *where, int increment)
                                              *where,
                                              build_int_cst (ptr_type_node,
                                                             increment)));
+  STRIP_USELESS_TYPE_CONVERSION (*where);
 }
 
 /* STMT is builtin call that writes bytes in bitmap ORIG, some bytes are dead