This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Simplify a VEC_SELECT fed by its own inverse
- From: Richard Henderson <rth at redhat dot com>
- To: Bill Schmidt <wschmidt at linux dot vnet dot ibm dot com>, gcc-patches at gcc dot gnu dot org
- Cc: ebotcazou at libertysurf dot fr, marc dot glisse at inria dot fr
- Date: Mon, 21 Apr 2014 13:48:47 -0700
- Subject: Re: [PATCH] Simplify a VEC_SELECT fed by its own inverse
- Authentication-results: sourceware.org; auth=none
- References: <1398088880 dot 19378 dot 28 dot camel at gnopaine> <alpine dot DEB dot 2 dot 10 dot 1404211826001 dot 3716 at laptop-mg dot saclay dot inria dot fr> <1398111582 dot 659 dot 3 dot camel at gnopaine>
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~