diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr79649.c | 53 | ||||
-rw-r--r-- | gcc/tree-loop-distribution.c | 7 |
4 files changed, 69 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 05bdf01..0697aec 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-02-21 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/79649 + * tree-loop-distribution.c (classify_partition): Give up on + non-generic address space loads/stores. + 2017-02-21 Aldy Hernandez <aldyh@redhat.com> * doc/loop.texi (Loop manipulation): Remove nonexistent diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b9c70a7..e35dd7c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2017-02-21 Jakub Jelinek <jakub@redhat.com> + 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 0000000..e3d0110 --- /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 0fec1d6..4b94d0f 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) |