On Tue, Sep 01, 2020 at 04:09:53PM +0800, luoxhu wrote: > On 2020/9/1 01:04, Segher Boessenkool wrote: > > For v a V4SI, x a SI, j some int, what do we generate for > > v[j&3] = x; > > ? > > This should be exactly the same as we generate for > > vec_insert(x, v, j); > > (the builtin does a modulo 4 automatically). > > No, even with my patch "stxv 34,-16(1);stwx 5,9,6;lxv 34,-16(1)" generated > currently.
I think you should solve the problem in the generic case, then, since it is (presumably) much more frequent. > Is it feasible and acceptable to expand some kind of pattern in expander > directly without > builtin transition? I don't understand what you mean? > I borrowed some of implementation from vec_extract. For vec_extract, the > issue also exists: > > source: gimple: > expand: asm: > 1) i = vec_extract (v, n); => i = __builtin_vec_ext_v4si (v, n); => > {r120:SI=unspec[r118:V4SI,r119:DI] 134;...} => slwi 9,6,2 vextuwrx > 3,9,2 > 2) i = vec_extract (v, 3); => i = __builtin_vec_ext_v4si (v, 3); => > {r120:SI=vec_select(r118:V4SI,parallel)...} => li 9,12 vextuwrx > 3,9,2 > 3) i = v[n%4]; => _1 = n & 3; i = VIEW_CONVERT_EXPR<int[4]>(v)[_1]; => > ... => stxv 34,-16(1);addi 9,1,-16; rldic 5,5,2,60; lwax 3,9,5 > 4) i = v[3]; => i = BIT_FIELD_REF <v, 32, 96>; => > {r120:SI=vec_select(r118:V4SI,parallel)...} => li 9,12; vextuwrx 3,9,2 > > Case 3) also couldn't handle the similar usage, and case 4) doesn't generate > builtin as expected, > it just expand to vec_select by coincidence. So does this mean both > vec_insert and vec_extract > and all other similar vector builtins should use IFN as suggested by Richard > Biener, to match the > pattern in gimple and expand both constant and variable index in expander? > Will this also be > beneficial for other targets except power? Or we should do that gradually > after this patch > approved as it seems another independent issue? Thanks:) I don't think we should do that at all? IFNs just complicate everything, there is no added value here: this is just data movement! We need to avoid the data aliasing some generic way. Segher