We were passing down the original type to recursive invocations
of multiple_of_p for say (int)(unsigned * unsigned).

Bootstrap and regtest pending on x86_64-unknown-linux-gnu.

2022-01-24  Richard Biener  <rguent...@suse.de>

        * fold-const.cc (multiple_of_p): Pass the correct type of
        the expression to the recursive invocation of multiple_of_p
        for conversions and use CASE_CONVERT.
---
 gcc/fold-const.cc | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/gcc/fold-const.cc b/gcc/fold-const.cc
index fd9c6352d4f..b155611578d 100644
--- a/gcc/fold-const.cc
+++ b/gcc/fold-const.cc
@@ -14149,14 +14149,14 @@ multiple_of_p (tree type, const_tree top, const_tree 
bottom)
        }
       return 0;
 
-    case NOP_EXPR:
+    CASE_CONVERT:
       /* Can't handle conversions from non-integral or wider integral type.  */
       if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
          || (TYPE_PRECISION (type)
              < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
        return 0;
-
-      /* fall through */
+      return multiple_of_p (TREE_TYPE (TREE_OPERAND (top, 0)),
+                           TREE_OPERAND (top, 0), bottom);
 
     case SAVE_EXPR:
       return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
-- 
2.31.1

Reply via email to