summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2022-01-24 14:59:00 +0100
committerRichard Biener <rguenther@suse.de>2022-01-31 09:38:10 +0100
commit625f16c798757dcbfdded841f01d7c566d15c55c (patch)
tree9d5ef9fef0337bced0c514059082bbe40e9f852c
parent23987912ddb4207de0714d81237f93f613557d1f (diff)
downloadgcc-625f16c798757dcbfdded841f01d7c566d15c55c.tar.gz
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 <rguenther@suse.de> 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.
-rw-r--r--gcc/fold-const.cc6
1 files 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);