diff options
author | Bill Schmidt <wschmidt@linux.vnet.ibm.com> | 2016-06-03 18:40:26 +0000 |
---|---|---|
committer | William Schmidt <wschmidt@gcc.gnu.org> | 2016-06-03 18:40:26 +0000 |
commit | 1c7733a760d7000a9c947d13b8c515d249c74fc8 (patch) | |
tree | 5110c0c23d32661687afff238efb983faba3d896 /gcc | |
parent | 641762ae264c86492d869d55559644e87ed36d46 (diff) | |
download | gcc-1c7733a760d7000a9c947d13b8c515d249c74fc8.zip gcc-1c7733a760d7000a9c947d13b8c515d249c74fc8.tar.gz gcc-1c7733a760d7000a9c947d13b8c515d249c74fc8.tar.bz2 |
rs6000-c.c (c/c-tree.h): Add #include.
[gcc]
2016-06-03 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* rs6000-c.c (c/c-tree.h): Add #include.
(altivec_resolve_overloaded_builtin): Handle ARRAY_TYPE arguments
in C++ when found in the base position of vec_ld or vec_st.
[gcc/testsuite]
2016-06-03 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* g++.dg/torture/ppc-ldst-array.C: New.
From-SVN: r237077
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000-c.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/ppc-ldst-array.C | 18 |
4 files changed, 45 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 068b874..6d3974b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-06-03 Bill Schmidt <wschmidt@linux.vnet.ibm.com> + + * rs6000-c.c (c/c-tree.h): Add #include. + (altivec_resolve_overloaded_builtin): Handle ARRAY_TYPE arguments + in C++ when found in the base position of vec_ld or vec_st. + 2016-06-03 Jan Hubicka <hubicka@ucw.cz> * tree-ssa-loop-niter.c (estimate_numbers_of_iterations_loop): Avoid diff --git a/gcc/config/rs6000/rs6000-c.c b/gcc/config/rs6000/rs6000-c.c index 79ac115..9e479a9 100644 --- a/gcc/config/rs6000/rs6000-c.c +++ b/gcc/config/rs6000/rs6000-c.c @@ -30,6 +30,7 @@ #include "stor-layout.h" #include "c-family/c-pragma.h" #include "langhooks.h" +#include "c/c-tree.h" @@ -5203,6 +5204,14 @@ assignment for unaligned loads and stores"); arg0 = build1 (NOP_EXPR, sizetype, arg0); tree arg1_type = TREE_TYPE (arg1); + if (TREE_CODE (arg1_type) == ARRAY_TYPE) + { + arg1_type = TYPE_POINTER_TO (TREE_TYPE (arg1_type)); + tree const0 = build_int_cstu (sizetype, 0); + tree arg1_elt0 = build_array_ref (loc, arg1, const0); + arg1 = build1 (ADDR_EXPR, arg1_type, arg1_elt0); + } + tree addr = fold_build2_loc (loc, POINTER_PLUS_EXPR, arg1_type, arg1, arg0); tree aligned = fold_build2_loc (loc, BIT_AND_EXPR, arg1_type, addr, @@ -5256,6 +5265,14 @@ assignment for unaligned loads and stores"); arg1 = build1 (NOP_EXPR, sizetype, arg1); tree arg2_type = TREE_TYPE (arg2); + if (TREE_CODE (arg2_type) == ARRAY_TYPE) + { + arg2_type = TYPE_POINTER_TO (TREE_TYPE (arg2_type)); + tree const0 = build_int_cstu (sizetype, 0); + tree arg2_elt0 = build_array_ref (loc, arg2, const0); + arg2 = build1 (ADDR_EXPR, arg2_type, arg2_elt0); + } + tree addr = fold_build2_loc (loc, POINTER_PLUS_EXPR, arg2_type, arg2, arg1); tree aligned = fold_build2_loc (loc, BIT_AND_EXPR, arg2_type, addr, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2822de1..ea1576b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-06-03 Bill Schmidt <wschmidt@linux.vnet.ibm.com> + + * g++.dg/torture/ppc-ldst-array.C: New. + 2016-06-03 Joseph Myers <joseph@codesourcery.com> PR target/71276 diff --git a/gcc/testsuite/g++.dg/torture/ppc-ldst-array.C b/gcc/testsuite/g++.dg/torture/ppc-ldst-array.C new file mode 100644 index 0000000..75862e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/ppc-ldst-array.C @@ -0,0 +1,18 @@ +/* { dg-do compile { target { powerpc64*-*-* } } } */ +/* { dg-skip-if "do not override mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */ +/* { dg-options "-mcpu=power8" } */ + +/* When compiled with C++, this code was breaking because of different + tree representations of arrays between C and C++. */ + +#include <altivec.h> + +extern vector float vf; + +void foo () +{ + float __attribute__((aligned (16))) x[4]; + float __attribute__((aligned (16))) y[4]; + vf = vec_ld (0, x); + vec_st (vf, 0, y); +} |