]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ivopts: fix wide_int_constant_multiple_p when VAL and DIV are 0. [PR114932]
authorTamar Christina <tamar.christina@arm.com>
Wed, 3 Jul 2024 08:30:28 +0000 (09:30 +0100)
committerTamar Christina <tamar.christina@arm.com>
Wed, 3 Jul 2024 08:30:28 +0000 (09:30 +0100)
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.

gcc/ChangeLog:

PR tree-optimization/114932
* tree-affine.cc (wide_int_constant_multiple_p): Support 0 and 0 being
multiples.

gcc/tree-affine.cc

index d6309c4390362b680f0aa97a41fac3281ade66fd..76117aa4fd6dc1ff27d82e3b4c0011b81fe18fcb 100644 (file)
@@ -880,11 +880,11 @@ free_affine_expand_cache (hash_map<tree, name_expansion *> **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 unless VAL and DIV are both zero
+   in which case neither MULT nor MULT_SET are updated.  */
 
 static bool
 wide_int_constant_multiple_p (const poly_widest_int &val,
@@ -895,6 +895,9 @@ wide_int_constant_multiple_p (const poly_widest_int &val,
 
   if (known_eq (val, 0))
     {
+      if (known_eq (div, 0))
+       return true;
+
       if (*mult_set && maybe_ne (*mult, 0))
        return false;
       *mult_set = true;