From d002d099b0107491a905b6d3e574ed0436fca3a9 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 21 Feb 2017 17:29:37 +0100 Subject: [PATCH] re PR middle-end/79649 (Memset pattern in named address space crashes compiler or generates wrong code) PR tree-optimization/79649 * tree-loop-distribution.c (classify_partition): Give up on non-generic address space loads/stores. * gcc.target/i386/pr79649.c: New test. From-SVN: r245631 --- gcc/ChangeLog | 6 +++ gcc/testsuite/ChangeLog | 3 ++ gcc/testsuite/gcc.target/i386/pr79649.c | 53 +++++++++++++++++++++++++ gcc/tree-loop-distribution.c | 7 ++++ 4 files changed, 69 insertions(+) create mode 100644 gcc/testsuite/gcc.target/i386/pr79649.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 05bdf01c8bf..0697aeccb9e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-02-21 Jakub Jelinek + + PR tree-optimization/79649 + * tree-loop-distribution.c (classify_partition): Give up on + non-generic address space loads/stores. + 2017-02-21 Aldy Hernandez * doc/loop.texi (Loop manipulation): Remove nonexistent diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b9c70a7b77b..e35dd7c0cda 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2017-02-21 Jakub Jelinek + PR tree-optimization/79649 + * gcc.target/i386/pr79649.c: New test. + PR target/79494 * gcc.dg/pr79494.c: New test. diff --git a/gcc/testsuite/gcc.target/i386/pr79649.c b/gcc/testsuite/gcc.target/i386/pr79649.c new file mode 100644 index 00000000000..e3d0110a1d0 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr79649.c @@ -0,0 +1,53 @@ +/* PR tree-optimization/79649 */ +/* { dg-do compile } */ +/* { dg-options "-O3 -fdump-tree-optimized" } */ +/* { dg-final { scan-tree-dump-not "__builtin_memset" "optimized" } } */ +/* { dg-final { scan-tree-dump-not "__builtin_memcpy" "optimized" } } */ +/* { dg-final { scan-tree-dump-not "__builtin_memmove" "optimized" } } */ + +typedef __SIZE_TYPE__ size_t; + +void +f1 (unsigned char __seg_gs *s, size_t n) +{ + for (size_t i = 0; i < n; ++i) + s[i] = 0; +} + +void +f2 (unsigned char __seg_gs *__restrict d, unsigned char __seg_gs *__restrict s, size_t n) +{ + for (size_t i = 0; i < n; ++i) + d[i] = s[i]; +} + +void +f3 (unsigned char __seg_gs *__restrict d, unsigned char *__restrict s, size_t n) +{ + for (size_t i = 0; i < n; ++i) + d[i] = s[i]; +} + +void +f4 (unsigned char *__restrict d, unsigned char __seg_gs *__restrict s, size_t n) +{ + for (size_t i = 0; i < n; ++i) + d[i] = s[i]; +} + +void +f5 (unsigned char __seg_gs *__restrict d, unsigned char __seg_fs *__restrict s, size_t n) +{ + for (size_t i = 0; i < n; ++i) + d[i] = s[i]; +} + +struct A { int a; char b[1024]; }; +extern struct A __seg_gs a; + +void +f6 (size_t n) +{ + for (size_t i = 0; i < n; ++i) + a.b[i] = 0; +} diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index 0fec1d6121c..4b94d0f9f8a 100644 --- a/gcc/tree-loop-distribution.c +++ b/gcc/tree-loop-distribution.c @@ -1072,6 +1072,13 @@ classify_partition (loop_p loop, struct graph *rdg, partition *partition) /* But exactly one store and/or load. */ for (j = 0; RDG_DATAREFS (rdg, i).iterate (j, &dr); ++j) { + tree type = TREE_TYPE (DR_REF (dr)); + + /* The memset, memcpy and memmove library calls are only + able to deal with generic address space. */ + if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (type))) + return; + if (DR_IS_READ (dr)) { if (single_load != NULL)