aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorBill Schmidt <wschmidt@linux.vnet.ibm.com>2016-06-03 18:40:26 +0000
committerWilliam Schmidt <wschmidt@gcc.gnu.org>2016-06-03 18:40:26 +0000
commit1c7733a760d7000a9c947d13b8c515d249c74fc8 (patch)
tree5110c0c23d32661687afff238efb983faba3d896 /gcc
parent641762ae264c86492d869d55559644e87ed36d46 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/config/rs6000/rs6000-c.c17
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/torture/ppc-ldst-array.C18
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);
+}