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]

Re: [PATCH] Simplify a VEC_SELECT fed by its own inverse


On 04/21/2014 01:19 PM, Bill Schmidt wrote:
> +      if (GET_CODE (trueop0) == VEC_SELECT
> +	  && GET_MODE (XEXP (trueop0, 0)) == mode)
> +	{
> +	  rtx op0_subop1 = XEXP (trueop0, 1);
> +	  gcc_assert (GET_CODE (op0_subop1) == PARALLEL);
> +	  gcc_assert (XVECLEN (trueop1, 0) == GET_MODE_NUNITS (mode));
> +
> +	  /* Apply the outer ordering vector to the inner one.  (The inner
> +	     ordering vector is expressly permitted to be of a different
> +	     length than the outer one.)  If the result is { 0, 1, ..., n-1 }
> +	     then the two VEC_SELECTs cancel.  */
> +	  for (int i = 0; i < XVECLEN (trueop1, 0); ++i)
> +	    {
> +	      rtx x = XVECEXP (trueop1, 0, i);
> +	      gcc_assert (CONST_INT_P (x));
> +	      rtx y = XVECEXP (op0_subop1, 0, INTVAL (x));
> +	      gcc_assert (CONST_INT_P (y));

In two places you're asserting that you've got a constant permutation.  Surely
there should be a non-assertion check and graceful exit for either select to be
a variable permutation.


r~


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