From 625f16c798757dcbfdded841f01d7c566d15c55c Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 24 Jan 2022 14:59:00 +0100 Subject: [PATCH] Fix multiple_of_p behavior with NOP_EXPR We were passing down the original type to recursive invocations of multiple_of_p for say (int)(unsigned * unsigned). 2022-01-24 Richard Biener PR tree-optimization/100499 * 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);