Hi Segher, On Wed, 2025-09-03 at 12:30 -0500, Segher Boessenkool wrote: > > > At least combine will merge that together with the move from the > const_int. What happened there? The dump file will tell you. >
Thanks for this information. My thought process was a bit convoluted. I did not pay attention to the combine pass, so I thought we had to scan for the complete pattern (along with what is in register operand #2). I removed the define_expand, and it does work! So I updated the define_insn as follows diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md index 7edc288a656..8b1beb8f713 100644 --- a/gcc/config/rs6000/altivec.md +++ b/gcc/config/rs6000/altivec.md @@ -2107,6 +2107,14 @@ "vsrv %0,%1,%2" [(set_attr "type" "vecsimple")]) +(define_insn "" + [(set (match_operand:VI2 0 "register_operand" "=v") + (ashift:VI2 (match_operand:VI2 1 "register_operand" "v") + (match_operand:VI2 2 "shift_constant_1" "")))] + "<VI_unit>" + "vaddu<VI_char>m %0,%1,%1" +) + > > ;; Expanders for arithmetic shift left on each vector element > > (define_expand "vashl<mode>3" > > [(set (match_operand:VEC_I 0 "vint_operand") > > (ashift:VEC_I (match_operand:VEC_I 1 "vint_operand") > > - (match_operand:VEC_I 2 "vint_operand")))] > > + (match_operand:VEC_I 2 "general_operand")))] > > "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode)" > > - "") > > +{ > > + rtx op2 = operands[2]; > > + if (CONSTANT_P(op2) && INTVAL(const_vector_elt (op2, 0)) != 1) { > > + operands[2] = copy_to_mode_reg (<MODE>mode, op2); > > + emit_insn (gen_rtx_SET (operands[0], > > + gen_rtx_ASHIFT (<MODE>mode, > > + operands[1], > > + operands[2]))); > > + DONE; > > + } > > +}) > > CONSTANT_P is much more general than what you want here. Just check > for > const_int more directly? > > But, don't do that at all! Tou do not want to use INTVAL, you want > to > check if the node is equal to const1_rtx directly! That is the > canonical representation for (const_int 1), it is a unique RTX, > wherever > (const_int 1) is used it always will use const1_rtx. As it says in > emit-rtl.cc: > Would it be ok to add a predicate instead like this Added the predicate to recognize a vector operand of all 1's in predicate.md +(define_predicate "shift_constant_1" + (match_code "const_vector") +{ + unsigned nunits = GET_MODE_NUNITS (mode), i; + for (i = 1; i < nunits; i++) { + if (INTVAL (CONST_VECTOR_ELT(op, i)) != 1) + return 0; + } + return 1; +}) + Actually this particular node is a vector constant, so we need to check if all its elements are 1. Please correct me if I am wrong, but I believe the const1_rtx does not work for vectors? Thanks and regards, Avinash Jayakar