diff mbox

[4/4,Vectorizer] Make reductions-via-shifts and vec_shr_optab endianness-neutral

Message ID 54639F40.5030309@arm.com
State New
Headers show

Commit Message

Alan Lawrence Nov. 12, 2014, 5:56 p.m. UTC
This redefines vec_shr optab to be the same (in terms of gcc vectors) regardless 
of target endianness. The vectorizer uses this to do reductions via shifts, so 
also change the vectorizer to shift things always the same way (from the 
midend's POV of vectors).

cross-tested check-gcc on (1) aarch64-none-elf and (2) aarch64_be-none-elf, both 
(a) using the endianness-independent vec_shr patterns at 
https://gcc.gnu.org/ml/gcc-patches/2014-09/msg01477.html and (b) in present 
state without any vec_shr patterns. No regressions on any combination.

Bootstrap + check-gcc on x86_64-none-linux-gnu.

This patch will break MIPS and PowerPC (which have bigendian vec_shr patterns). 
Candidate MIPS fix previously posted at 
https://gcc.gnu.org/ml/gcc-patches/2014-09/msg01481.html .
PowerPC should be fixed by 
https://gcc.gnu.org/ml/gcc-patches/2014-09/msg01480.html ; I've bootstrapped 
this on powerpc64-unknown-linux-gnu, check-gcc in progress.

gcc/ChangeLog:

	* optabs.c (shift_amt_for_vec_perm_mask): Remove code conditional on
	BYTES_BIG_ENDIAN.
	* tree-vect-loop.c (calc_vec_perm_mask_for_shift,
	vect_create_epilog_for_reduction): Likewise.
	* doc/md.texi (vec_shr_m): Clarify direction of shifting.

Comments

Richard Biener Nov. 13, 2014, 11:24 a.m. UTC | #1
On Wed, Nov 12, 2014 at 6:56 PM, Alan Lawrence <alan.lawrence@arm.com> wrote:
> This redefines vec_shr optab to be the same (in terms of gcc vectors)
> regardless of target endianness. The vectorizer uses this to do reductions
> via shifts, so also change the vectorizer to shift things always the same
> way (from the midend's POV of vectors).
>
> cross-tested check-gcc on (1) aarch64-none-elf and (2) aarch64_be-none-elf,
> both (a) using the endianness-independent vec_shr patterns at
> https://gcc.gnu.org/ml/gcc-patches/2014-09/msg01477.html and (b) in present
> state without any vec_shr patterns. No regressions on any combination.
>
> Bootstrap + check-gcc on x86_64-none-linux-gnu.
>
> This patch will break MIPS and PowerPC (which have bigendian vec_shr
> patterns). Candidate MIPS fix previously posted at
> https://gcc.gnu.org/ml/gcc-patches/2014-09/msg01481.html .
> PowerPC should be fixed by
> https://gcc.gnu.org/ml/gcc-patches/2014-09/msg01480.html ; I've bootstrapped
> this on powerpc64-unknown-linux-gnu, check-gcc in progress.

Ok.

Thanks.
Richard.

> gcc/ChangeLog:
>
>         * optabs.c (shift_amt_for_vec_perm_mask): Remove code conditional on
>         BYTES_BIG_ENDIAN.
>         * tree-vect-loop.c (calc_vec_perm_mask_for_shift,
>         vect_create_epilog_for_reduction): Likewise.
>         * doc/md.texi (vec_shr_m): Clarify direction of shifting.
diff mbox

Patch

diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi
index 3b5511ec39a86fb4278ebd766420eaec5eb05d8b..3742ca3e3f1c428ae8a84885969b31806df02ebd 100644
--- a/gcc/doc/md.texi
+++ b/gcc/doc/md.texi
@@ -4798,7 +4798,7 @@  of a wider mode.)
 
 @cindex @code{vec_shr_@var{m}} instruction pattern
 @item @samp{vec_shr_@var{m}}
-Whole vector right shift in bits.
+Whole vector right shift in bits, i.e. towards element 0.
 Operand 1 is a vector to be shifted.
 Operand 2 is an integer shift amount in bits.
 Operand 0 is where the resulting shifted vector is stored.
diff --git a/gcc/optabs.c b/gcc/optabs.c
index 9650b58a8ed2c6701f653c0d6c15dba71b04b089..6e8f52e1d88844b060857356ac2ec8b7cba059c6 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -6626,8 +6626,6 @@  shift_amt_for_vec_perm_mask (rtx sel)
 	return NULL_RTX;
     }
 
-  if (BYTES_BIG_ENDIAN)
-    first = (2 * nelt) - first;
   return GEN_INT (first * bitsize);
 }
 
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index f1d327f42a5c517a01121135569dd014e49502e0..91d82b72d0f0ef944d0fa5c23da36aff0384a9d0 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -3091,7 +3091,7 @@  calc_vec_perm_mask_for_shift (enum machine_mode mode, unsigned int offset,
   unsigned int i, nelt = GET_MODE_NUNITS (mode);
 
   for (i = 0; i < nelt; i++)
-    sel[i] = (BYTES_BIG_ENDIAN ? i - offset : i + offset) & (2*nelt - 1);
+    sel[i] = (i + offset) & (2*nelt - 1);
 }
 
 /* Checks whether the target supports whole-vector shifts for vectors of mode
@@ -3906,7 +3906,7 @@  vect_create_epilog_for_reduction (vec<tree> vect_defs, gimple stmt,
   gimple epilog_stmt = NULL;
   enum tree_code code = gimple_assign_rhs_code (stmt);
   gimple exit_phi;
-  tree bitsize, bitpos;
+  tree bitsize;
   tree adjustment_def = NULL;
   tree vec_initial_def = NULL;
   tree reduction_op, expr, def;
@@ -4416,14 +4416,8 @@  vect_create_epilog_for_reduction (vec<tree> vect_defs, gimple stmt,
         dump_printf_loc (MSG_NOTE, vect_location,
 			 "extract scalar result\n");
 
-      if (BYTES_BIG_ENDIAN)
-        bitpos = size_binop (MULT_EXPR,
-                             bitsize_int (TYPE_VECTOR_SUBPARTS (vectype) - 1),
-                             TYPE_SIZE (scalar_type));
-      else
-        bitpos = bitsize_zero_node;
-
-      rhs = build3 (BIT_FIELD_REF, scalar_type, new_temp, bitsize, bitpos);
+      rhs = build3 (BIT_FIELD_REF, scalar_type,
+		    new_temp, bitsize, bitsize_zero_node);
       epilog_stmt = gimple_build_assign (new_scalar_dest, rhs);
       new_temp = make_ssa_name (new_scalar_dest, epilog_stmt);
       gimple_assign_set_lhs (epilog_stmt, new_temp);