On Fri, 4 Feb 2022, Richard Sandiford wrote: > Richard Biener <[email protected]> writes: > > This removes the odd check of size_type_node when handling left-shifts > > as multiplications of 1 << N and instead uses the type as specified. > > It also moves left-shift handling next to multiplications where it > > semantically belongs. > > > > Boostrap and regtest pending on x86_64-unknown-linux-gnu. > > > > OK? (I failed to short-cut the wide_int_to_tree for a > > poly_int_cst_p bottom) > > > > Thanks, > > Richard. > > > > 2022-01-24 Richard Biener <[email protected]> > > > > * fold-const.cc (multiple_of_p): Re-write and move LSHIFT_EXPR > > handling. > > --- > > gcc/fold-const.cc | 33 ++++++++++++++++----------------- > > 1 file changed, 16 insertions(+), 17 deletions(-) > > > > diff --git a/gcc/fold-const.cc b/gcc/fold-const.cc > > index b155611578d..a0a4913c45e 100644 > > --- a/gcc/fold-const.cc > > +++ b/gcc/fold-const.cc > > @@ -14068,7 +14068,7 @@ int > > multiple_of_p (tree type, const_tree top, const_tree bottom) > > { > > gimple *stmt; > > - tree t1, op1, op2; > > + tree op1, op2; > > > > if (operand_equal_p (top, bottom, 0)) > > return 1; > > @@ -14114,6 +14114,21 @@ multiple_of_p (tree type, const_tree top, > > const_tree bottom) > > return (multiple_of_p (type, TREE_OPERAND (top, 1), bottom) > > || multiple_of_p (type, TREE_OPERAND (top, 0), bottom)); > > > > + case LSHIFT_EXPR: > > + /* Handle X << CST as X * (1 << CST) and only process the constant. > > */ > > + if (TREE_CODE (TREE_OPERAND (top, 1)) == INTEGER_CST) > > + { > > + op1 = TREE_OPERAND (top, 1); > > + if (wi::gtu_p (TYPE_PRECISION (type), wi::to_wide (op1))) > > + { > > + wide_int mul_op > > + = wi::one (TYPE_PRECISION (type)) << wi::to_wide (op1); > > + return multiple_of_p (type, > > + wide_int_to_tree (type, mul_op), bottom); > > + } > > + } > > + return 0; > > + > > LGTM. Sorry for the slow response. > > I guess the condition could be written: > > if (wi::to_widest (op1) < TYPE_PRECISION (type)) > > which might be more readable, and also avoids accidentally reinterpreting > a sign.
Good idea - I'll adjust, re-test and push. Thanks, Richard.
