On Fri, Dec 11, 2020 at 11:34:01AM +0100, Richard Biener wrote: > Shouldn't we simply use gen_int_mode?
You're right, that is shorter. So like this? BTW, looking at gen_int_mode, wouldn't it be better to add an overload for HOST_WIDE_INT first argument so that it wouldn't need to go through poly_int? Or would that then be ambiguous with int, unsigned etc. arguments? 2020-12-10 Jakub Jelinek <ja...@redhat.com> PR rtl-optimization/98229 * optabs.c (expand_doubleword_mod): Canonicalize op1 and 1 - INTVAL (op1) as word_mode constants when used in word_mode arithmetics. * gcc.c-torture/compile/pr98229.c: New test. --- gcc/optabs.c.jj 2020-12-11 00:30:41.892272376 +0100 +++ gcc/optabs.c 2020-12-11 11:51:15.902855312 +0100 @@ -1081,7 +1081,8 @@ expand_doubleword_mod (machine_mode mode return NULL_RTX; } } - rtx remainder = expand_divmod (1, TRUNC_MOD_EXPR, word_mode, sum, op1, + rtx remainder = expand_divmod (1, TRUNC_MOD_EXPR, word_mode, sum, + gen_int_mode (INTVAL (op1), word_mode), NULL_RTX, 1, OPTAB_DIRECT); if (remainder == NULL_RTX) return NULL_RTX; @@ -1099,7 +1100,8 @@ expand_doubleword_mod (machine_mode mode return NULL_RTX; } mask = expand_simple_binop (word_mode, AND, mask, - GEN_INT (1 - INTVAL (op1)), + gen_int_mode (1 - INTVAL (op1), + word_mode), NULL_RTX, 1, OPTAB_DIRECT); if (mask == NULL_RTX) return NULL_RTX; --- gcc/testsuite/gcc.c-torture/compile/pr98229.c.jj 2020-12-11 11:49:34.518993120 +0100 +++ gcc/testsuite/gcc.c-torture/compile/pr98229.c 2020-12-11 11:49:34.517993131 +0100 @@ -0,0 +1,7 @@ +/* PR rtl-optimization/98229 */ + +unsigned long long +foo (unsigned long long x) +{ + return x % ~0U; +} Jakub