On Fri, 30 Sept 2022 at 21:38, Richard Sandiford wrote: > > Richard Sandiford via Gcc-patches writes: > > Prathamesh Kulkarni writes: > >> Sorry to ask a silly question but in which case shall we select 2nd vector ? > >> For num_poly_int_coeffs == 2, > >> a1 /trunc n1 == (a1 + 0x) / (n1.coeffs[0] + n1.coeffs[1]*x) > >> If a1/trunc n1 succeeds, > >> 0 / n1.coeffs[1] == a1/n1.coeffs[0] == 0. > >> So, a1 has to be < n1.coeffs[0] ? > > > > Remember that a1 is itself a poly_int. It's not necessarily a constant. > > > > E.g. the TRN1 .D instruction maps to a VEC_PERM_EXPR with the selector: > > > > { 0, 2 + 2x, 1, 4 + 2x, 2, 6 + 2x, ... } > > Sorry, should have been: > > { 0, 2 + 2x, 2, 4 + 2x, 4, 6 + 2x, ... } Hi Richard, Thanks for the clarifications, and sorry for late reply. I have attached POC patch that tries to implement the above approach. Passes bootstrap+test on x86_64-linux-gnu and aarch64-linux-gnu for VLS vectors. For VLA vectors, I have only done limited testing so far. It seems to pass couple of tests written in the patch for nelts_per_pattern == 3, and folds the following svld1rq test: int32x4_t v = {1, 2, 3, 4}; return svld1rq_s32 (svptrue_b8 (), &v[0]) into: return {1, 2, 3, 4, ...}; I will try to bootstrap+test it on SVE machine to test further for VLA folding. I have a couple of questions: 1] When mask selects elements from same vector but from different patterns: For eg: arg0 = {1, 11, 2, 12, 3, 13, ...}, arg1 = {21, 31, 22, 32, 23, 33, ...}, mask = {0, 0, 0, 1, 0, 2, ... }, All have npatterns = 2, nelts_per_pattern = 3. With above mask, Pattern {0, ...} selects arg0[0], ie {1, ...} Pattern {0, 1, 2, ...} selects arg0[0], arg0[1], arg0[2], ie {1, 11, 2, ...} While arg0[0] and arg0[2] belong to same pattern, arg0[1] belongs to different pattern in arg0. The result is: res = {1, 1, 1, 11, 1, 2, ...} In this case, res's 2nd pattern {1, 11, 2, ...} is encoded with: with a0 = 1, a1 = 11, S = -9. Is that expected tho ? It seems to create a new encoding which wasn't present in the input vector. For instance, the next elem in sequence would be -7, which is not present originally in arg0. I suppose it's fine since if the user defines mask to have pattern {0, 1, 2, ...} they intended result to have pattern with above encoding. Just wanted to confirm if this is correct ? 2] Could you please suggest a test-case for S < 0 ? I am not able to come up with one :/ Thanks, Prathamesh > > > which is an interleaving of the two patterns: > > > > { 0, 2, 4, ... } a0 = 0, a1 = 2, S = 2 > > { 2 + 2x, 4 + 2x, 6 + 2x } a0 = 2 + 2x, a1 = 4 + 2x, S = 2