+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
#include "stor-layout.h"
#include "c-family/c-pragma.h"
#include "langhooks.h"
+#include "c/c-tree.h"
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,
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,
--- /dev/null
+/* { 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);
+}