https://gcc.gnu.org/g:25127123100f04c2d5d70c6933a5f5aedcd69c40

commit r15-1808-g25127123100f04c2d5d70c6933a5f5aedcd69c40
Author: Tamar Christina <tamar.christ...@arm.com>
Date:   Wed Jul 3 09:30:28 2024 +0100

    ivopts: fix wide_int_constant_multiple_p when VAL and DIV are 0.  [PR114932]
    
    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.

Diff:
---
 gcc/tree-affine.cc | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/gcc/tree-affine.cc b/gcc/tree-affine.cc
index d6309c43903..76117aa4fd6 100644
--- a/gcc/tree-affine.cc
+++ b/gcc/tree-affine.cc
@@ -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;

Reply via email to