summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-01-22 10:10:25 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2019-01-22 10:10:25 +0100
commitc4814f99ed1340f009a804a19e81f787f7b31ea6 (patch)
tree12b6bf05546c0a6b3e9bcc4b10d90a4d3b37d812
parentc4d825b5e780cea568317b2ca2c82420b677f119 (diff)
downloadgcc-c4814f99ed1340f009a804a19e81f787f7b31ea6.tar.gz
re PR rtl-optimization/49429 (dse.c change (r175063) causes execution failures)
PR rtl-optimization/49429 PR target/49454 PR rtl-optimization/86334 PR target/88906 * expr.c (emit_block_move_hints): Move marking of MEM_EXPRs addressable from here... (emit_block_op_via_libcall): ... to here. * gcc.target/i386/pr86334.c: New test. * gcc.target/i386/pr88906.c: New test. From-SVN: r268138
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/expr.c17
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/gcc.target/i386/pr86334.c21
-rw-r--r--gcc/testsuite/gcc.target/i386/pr88906.c21
5 files changed, 70 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 18f99a1daeb..e122c653996 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2019-01-22 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/49429
+ PR target/49454
+ PR rtl-optimization/86334
+ PR target/88906
+ * expr.c (emit_block_move_hints): Move marking of MEM_EXPRs
+ addressable from here...
+ (emit_block_op_via_libcall): ... to here.
+
2019-01-22 Richard Biener <rguenther@suse.de>
* tree-vect-loop.c (vect_analyze_loop_operations): Use
diff --git a/gcc/expr.c b/gcc/expr.c
index 6ccba9d53ad..dcc9214b7e4 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -1631,14 +1631,6 @@ emit_block_move_hints (rtx x, rtx y, rtx size, enum block_op_methods method,
if (may_use_call < 0)
return pc_rtx;
- /* Since x and y are passed to a libcall, mark the corresponding
- tree EXPR as addressable. */
- tree y_expr = MEM_EXPR (y);
- tree x_expr = MEM_EXPR (x);
- if (y_expr)
- mark_addressable (y_expr);
- if (x_expr)
- mark_addressable (x_expr);
retval = emit_block_copy_via_libcall (x, y, size,
method == BLOCK_OP_TAILCALL);
}
@@ -1884,6 +1876,15 @@ emit_block_op_via_libcall (enum built_in_function fncode, rtx dst, rtx src,
tree call_expr, dst_tree, src_tree, size_tree;
machine_mode size_mode;
+ /* Since dst and src are passed to a libcall, mark the corresponding
+ tree EXPR as addressable. */
+ tree dst_expr = MEM_EXPR (dst);
+ tree src_expr = MEM_EXPR (src);
+ if (dst_expr)
+ mark_addressable (dst_expr);
+ if (src_expr)
+ mark_addressable (src_expr);
+
dst_addr = copy_addr_to_reg (XEXP (dst, 0));
dst_addr = convert_memory_address (ptr_mode, dst_addr);
dst_tree = make_tree (ptr_type_node, dst_addr);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 86910c2b4f7..56e8174c8ff 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,12 @@
+2019-01-22 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/49429
+ PR target/49454
+ PR rtl-optimization/86334
+ PR target/88906
+ * gcc.target/i386/pr86334.c: New test.
+ * gcc.target/i386/pr88906.c: New test.
+
2019-01-21 Jakub Jelinek <jakub@redhat.com>
PR c++/88949
diff --git a/gcc/testsuite/gcc.target/i386/pr86334.c b/gcc/testsuite/gcc.target/i386/pr86334.c
new file mode 100644
index 00000000000..79ed6926c86
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr86334.c
@@ -0,0 +1,21 @@
+/* PR rtl-optimization/86334 */
+/* { dg-do run { target ia32 } } */
+/* { dg-options "-O -march=i386 -mtune=athlon -minline-all-stringops -minline-stringops-dynamically -mmemcpy-strategy=libcall:-1:align -Wno-psabi" } */
+
+typedef int V __attribute__ ((vector_size (64)));
+
+static inline V
+foo (V g)
+{
+ g[0] = 4;
+ return g;
+}
+
+int
+main ()
+{
+ V x = foo ((V) { });
+ if (x[0] != 4 || x[1] || x[2] || x[3] || x[4] || x[5] || x[6] || x[7])
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr88906.c b/gcc/testsuite/gcc.target/i386/pr88906.c
new file mode 100644
index 00000000000..5439a28f67b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr88906.c
@@ -0,0 +1,21 @@
+/* PR target/88906 */
+/* { dg-do run { target ia32 } } */
+/* { dg-options "-O -march=i386 -mtune=k6 -minline-all-stringops -minline-stringops-dynamically -mmemcpy-strategy=libcall:-1:align -Wno-psabi" } */
+
+typedef unsigned V __attribute__ ((vector_size (16)));
+
+static inline V
+foo (V v)
+{
+ __builtin_sub_overflow (0, 0, &v[0]);
+ return v;
+}
+
+int
+main ()
+{
+ V v = foo ((V) { ~0 });
+ if (v[0] || v[1] || v[2] || v[3])
+ __builtin_abort ();
+ return 0;
+}