Hi All, wide_int_constant_multiple_p tries to check if for two tree expressions a and b that there is a multiplier which makes a == b * c. This code however seems to think that there's no c where a=0 and b=0 are equal which is of course wrong. This fixes it and also fixes the comment. Bootstrapped Regtested on aarch64-none-linux-gnu, x86_64-pc-linux-gnu -m32, -m64 and no issues. Ok for master? Thanks, Tamar gcc/ChangeLog: PR tree-optimization/114932 * tree-affine.cc (wide_int_constant_multiple_p): Support 0 and 0 being multiples. --- diff --git a/gcc/tree-affine.cc b/gcc/tree-affine.cc index d6309c4390362b680f0aa97a41fac3281ade66fd..bfea0fe826a6affa0ace154e3ca38c9ef632fcba 100644 --- a/gcc/tree-affine.cc +++ b/gcc/tree-affine.cc @@ -880,11 +880,10 @@ free_affine_expand_cache (hash_map **cache) *cache = NULL; } -/* If VAL != CST * DIV for any constant CST, returns false. - Otherwise, if *MULT_SET is true, additionally compares CST and MULT, - and if they are different, returns false. Finally, if neither of these - two cases occur, true is returned, and CST is stored to MULT and MULT_SET - is set to true. */ +/* If VAL == CST * DIV for any constant CST, returns true. + and if *MULT_SET is true, additionally compares CST and MULT + and if they are different, returns false. If true is returned, CST is + stored to MULT and MULT_SET is set to true. */ static bool wide_int_constant_multiple_p (const poly_widest_int &val, @@ -895,6 +894,12 @@ wide_int_constant_multiple_p (const poly_widest_int &val, if (known_eq (val, 0)) { + if (maybe_eq (div, 0)) + { + *mult = 1; + return true; + } + if (*mult_set && maybe_ne (*mult, 0)) return false; *mult_set = true; --