On Thu, Apr 18, 2019 at 11:16 AM Richard Sandiford <richard.sandif...@arm.com> wrote: > > When testing PR 85164, the baseline bootstrap-ubsan results had > a lot of failures from int_const_binop. This is because with the > new overflow handling we can sometimes do: > > poly_res = res; > > on an uninitialised res. > > Tested with bootstrap-ubsan on aarch64-linux-gnu and x86_64-linux-gnu. > OK to install? (This is a GCC 9 regression FWIW.)
OK. Richard. > Richard > > > 2019-04-18 Richard Sandiford <richard.sandif...@arm.com> > > gcc/ > * fold-const.c (int_const_binop): Return early on failure. > > Index: gcc/fold-const.c > =================================================================== > --- gcc/fold-const.c 2019-04-04 08:34:52.001938080 +0100 > +++ gcc/fold-const.c 2019-04-18 10:11:12.336697917 +0100 > @@ -1173,7 +1173,6 @@ poly_int_binop (poly_wide_int &res, enum > int_const_binop (enum tree_code code, const_tree arg1, const_tree arg2, > int overflowable) > { > - bool success = false; > poly_wide_int poly_res; > tree type = TREE_TYPE (arg1); > signop sign = TYPE_SIGN (type); > @@ -1183,17 +1182,18 @@ int_const_binop (enum tree_code code, co > { > wide_int warg1 = wi::to_wide (arg1), res; > wide_int warg2 = wi::to_wide (arg2, TYPE_PRECISION (type)); > - success = wide_int_binop (res, code, warg1, warg2, sign, &overflow); > + if (!wide_int_binop (res, code, warg1, warg2, sign, &overflow)) > + return NULL_TREE; > poly_res = res; > } > - else if (poly_int_tree_p (arg1) && poly_int_tree_p (arg2)) > - success = poly_int_binop (poly_res, code, arg1, arg2, sign, &overflow); > - if (success) > - return force_fit_type (type, poly_res, overflowable, > - (((sign == SIGNED || overflowable == -1) > - && overflow) > - | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))); > - return NULL_TREE; > + else if (!poly_int_tree_p (arg1) > + || !poly_int_tree_p (arg2) > + || !poly_int_binop (poly_res, code, arg1, arg2, sign, &overflow)) > + return NULL_TREE; > + return force_fit_type (type, poly_res, overflowable, > + (((sign == SIGNED || overflowable == -1) > + && overflow) > + | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))); > } > > /* Return true if binary operation OP distributes over addition in operand