On Wed, May 20, 2026 at 9:05 AM Hongtao Liu <[email protected]> wrote: > > On Wed, May 20, 2026 at 2:55 PM Uros Bizjak <[email protected]> wrote: > > > > On Fri, May 15, 2026 at 10:40 AM Uros Bizjak <[email protected]> wrote: > > > > > > On Fri, May 15, 2026 at 3:46 AM Liu, Hongtao <[email protected]> > > > wrote: > > > > > > > > > > > > > > > > > -----Original Message----- > > > > > From: Roger Sayle <[email protected]> > > > > > Sent: Friday, May 15, 2026 5:23 AM > > > > > To: 'GCC Patches' <[email protected]> > > > > > Cc: 'Hongtao Liu' <[email protected]>; Liu, Hongtao > > > > > <[email protected]>; 'Uros Bizjak' <[email protected]> > > > > > Subject: [PATCH] Improve vector increment/decrement on x86. > > > > > > > > > > > > > > > This patch improves the code generated by the i386 backend for > > > > > incrementing > > > > > (adding one to) and decrementing (subtracting one from) a vector. > > > > > With SSE > > > > > materializing the vector -1 is more efficient than materializing the > > > > > vector +1, > > > > > hence x + 1 (increment) is better expressed as x - (-1), and x - 1 > > > > > (decrement) is > > > > > better expressed as x + (-1). Conveniently the relevant additions and > > > > > subtractions are specified as a single pattern, using a plusminus > > > > > iterator, in the > > > > > machine description. > > > > > > > > Can we add pre_reload define_insn_and_split for them, > > > > > > > > (set (reg:V16QI 100 [ _2 ]) > > > > (minus:V16QI (reg:V16QI 107 [ x ]) > > > > (const_vector:V16QI [ > > > > (const_int 1 [0x1]) repeated x16 > > > > ]))) > > > > > > > > Theoretically, it should be able to capture more optimization > > > > opportunities (if vector +/-1 is only exposed through RTL optimization) > > > > Another issue is with insn canonicalization [1], where > > > > (minus x (const_int n)) is converted to (plus x (const_int -n)). > > > > According to the above, x - (-1) is not a canonical form and > > optimizers will convert it to the canonical form anyway. > > In recog.cc > > case MINUS: > if (CONST_SCALAR_INT_P (XEXP (x, 1))) > validate_change (object, loc, > simplify_gen_binary > (PLUS, GET_MODE (x), XEXP (x, 0), > simplify_gen_unary (NEG, > GET_MODE (x), XEXP (x, 1), > GET_MODE (x))), 1); > break; > > Canonicalization is restricted to CONST_SCALAR_INT_P, that's why it's > not trigger for vector.
Thanks for pointing this difference out. Uros.
