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: Bill Schmidt <wschmidt at linux dot vnet dot ibm dot com>
- To: Richard Henderson <rth at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org, ebotcazou at libertysurf dot fr, marc dot glisse at inria dot fr
- Date: Mon, 21 Apr 2014 21:45:32 -0500
- 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> <5355842F dot 3070801 at redhat dot com>
On Mon, 2014-04-21 at 13:48 -0700, Richard Henderson wrote:
> 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.
Ah. I was not aware this was even a possibility. From rtl.def:
/* Describes an operation that selects parts of a vector.
Operands 0 is the source vector, operand 1 is a PARALLEL that contains
a CONST_INT for each of the subparts of the result vector, giving the
number of the source subpart that should be stored into it. */
DEF_RTL_EXPR(VEC_SELECT, "vec_select", "ee", RTX_BIN_ARITH)
If variable permutations are possible with VEC_SELECT, then I suppose
this commentary should be updated. The GCC internals document contains
similar text in section 13.12.
I'll rebuild the patch per your comments tomorrow. Thanks for letting
me know about this!
Regards,
Bill
>
>
> r~
>