On Mon, Apr 25, 2016 at 9:45 PM, Richard Sandiford <rdsandif...@googlemail.com> wrote:
>>> Can you please investigate, what is wrong with all_ones_operand so it >>> doesn't accept all (-1) operands? >> >> Does following work: >> >> ;; Return true if operand is a (vector) constant with all bits set. >> (define_predicate "all_ones_operand" >> (match_code "const_int,const_wide_int,const_vector") >> { >> if (op == constm1_rtx) >> return true; >> >> if (CONST_INT_P (op)) >> return INTVAL (op) == HOST_WIDE_INT_M1; >> >> if (mode == VOIDmode) >> mode = GET_MODE (op); >> return op == CONSTM1_RTX (mode); >> }) > > const_wide_int isn't necessary here. An all-1s integer will always > use CONST_INT, regardless of the mode size. > > I think this reduces to: > > (define_predicate "all_ones_operand" > (match_code "const_int,const_vector") > { > if (CONST_INT_P (op)) > return INTVAL (op) == HOST_WIDE_INT_M1; > return op == CONSTM1_RTX (GET_MODE (op)); > } > > (which is still more complex than it should be -- roll on CONST_INTs > with modes. :-)) This is now implemented in a different way, but nevertheless some const_wide_int codes were removed from other predicates in a follow-up patch. Uros.