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 PR54219


This fixes an error I introduced when making the VECTOR_CST representation
changes.

Bootstrap and regtest pending on x86_64-unknown-linux-gnu.

Richard.

2012-08-10  Richard Guenther  <rguenther@suse.de>

	PR middle-end/54219
	* fold-const.c (fold_ternary_loc): Do not reverse the mask
	when canonicalizing it when folding VEC_PERM_EXPR.

	* gcc.dg/torture/vector-shuffle1.c: New testcase.

Index: gcc/fold-const.c
===================================================================
*** gcc/fold-const.c	(revision 190288)
--- gcc/fold-const.c	(working copy)
*************** fold_ternary_loc (location_t loc, enum t
*** 14189,14195 ****
  	      tree *tsel = XALLOCAVEC (tree, nelts);
  	      tree eltype = TREE_TYPE (TREE_TYPE (arg2));
  	      for (i = 0; i < nelts; i++)
! 		tsel[i] = build_int_cst (eltype, sel[nelts - i - 1]);
  	      t = build_vector (TREE_TYPE (arg2), tsel);
  	      return build3_loc (loc, VEC_PERM_EXPR, type, op0, op1, t);
  	    }
--- 14189,14195 ----
  	      tree *tsel = XALLOCAVEC (tree, nelts);
  	      tree eltype = TREE_TYPE (TREE_TYPE (arg2));
  	      for (i = 0; i < nelts; i++)
! 		tsel[i] = build_int_cst (eltype, sel[i]);
  	      t = build_vector (TREE_TYPE (arg2), tsel);
  	      return build3_loc (loc, VEC_PERM_EXPR, type, op0, op1, t);
  	    }
Index: gcc/testsuite/gcc.dg/torture/vector-shuffle1.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/vector-shuffle1.c	(revision 0)
--- gcc/testsuite/gcc.dg/torture/vector-shuffle1.c	(working copy)
***************
*** 0 ****
--- 1,20 ----
+ /* PR54219 */
+ /* { dg-do run } */
+ 
+ extern void abort (void);
+ 
+ typedef int v2si __attribute__((vector_size(2*sizeof(int))));
+ 
+ v2si f(v2si x)
+ {
+   /* This requires canonicalization of the mask to { 1, 0 }.  */
+   return __builtin_shuffle(x,x, (v2si) { 5, 0 });
+ }
+ 
+ int main()
+ {
+   v2si y = f((v2si) { 1, 2 });
+   if (y[0] != 2 || y[1] != 1)
+     abort ();
+   return 0;
+ }


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