This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix variant of PR60819
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Cc: "Joseph S. Myers" <joseph at codesourcery dot com>
- Date: Mon, 14 Apr 2014 10:25:49 +0200 (CEST)
- Subject: [PATCH] Fix variant of PR60819
- Authentication-results: sourceware.org; auth=none
While digging in PR60819 (and thinking whether the original testcase
is valid) we figured that a clearly valid testcase is miscompiled
as well. That's because of the C/C++ frontends implementation of
vector indexing by decaying the vector to a element pointer. The
helper for that fails to apply the may-alias properties of the
vector type to the build scalar pointer type.
The following patch fixes that.
Bootstrapped and tested x86_64-unknown-linux-gnu, I'm re-testing
with some other changes.
Ok for trunk and branches after 4.9.0 is out?
Thanks,
Richard.
2014-04-14 Richard Biener <rguenther@suse.de>
Marc Glisse <marc.glisse@inria.fr>
PR c/60819
c-family/
* c-common.c (convert_vector_to_pointer_for_subscript): Properly
apply may-alias properties of the vector type to the scalar pointer
type.
* gcc.target/i386/vec-may_alias.c: New testcase.
Index: gcc/c-family/c-common.c
===================================================================
--- gcc/c-family/c-common.c (revision 209333)
+++ gcc/c-family/c-common.c (working copy)
@@ -11777,22 +11777,23 @@ convert_vector_to_pointer_for_subscript
tree type = TREE_TYPE (*vecp);
tree type1;
if (TREE_CODE (index) == INTEGER_CST)
if (!tree_fits_uhwi_p (index)
|| tree_to_uhwi (index) >= TYPE_VECTOR_SUBPARTS (type))
warning_at (loc, OPT_Warray_bounds, "index value is out of bound");
c_common_mark_addressable_vec (*vecp);
type = build_qualified_type (TREE_TYPE (type), TYPE_QUALS (type));
- type = build_pointer_type (type);
type1 = build_pointer_type (TREE_TYPE (*vecp));
+ type = build_pointer_type_for_mode (type, ptr_mode,
+ TYPE_REF_CAN_ALIAS_ALL (type1));
*vecp = build1 (ADDR_EXPR, type1, *vecp);
*vecp = convert (type, *vecp);
}
}
/* Determine which of the operands, if any, is a scalar that needs to be
converted to a vector, for the range of operations. */
enum stv_conv
scalar_to_vector (location_t loc, enum tree_code code, tree op0, tree op1,
bool complain)
Index: gcc/testsuite/gcc.target/i386/vec-may_alias.c
===================================================================
--- gcc/testsuite/gcc.target/i386/vec-may_alias.c (revision 0)
+++ gcc/testsuite/gcc.target/i386/vec-may_alias.c (working copy)
@@ -0,0 +1,16 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -w -Wno-abi" } */
+
+typedef int v2si __attribute__ ((vector_size (8)));
+typedef short v4hi __attribute__ ((vector_size (8), may_alias));
+
+__attribute__ ((noinline, noclone))
+int f (v2si A, int N)
+{ return ((v4hi)A)[N]; }
+
+int main(){
+ v2si x = { 0, 0 };
+ if (f (x, 0) || f (x, 1) || f (x, 2) || f (x, 3))
+ __builtin_abort ();
+ return 0;
+}