This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix variant of PR60819


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;
+}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]