From c4cdbeb4802cec34a912e343629d8e28b20128c7 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Tue, 5 Apr 2005 09:06:23 +0200 Subject: re PR tree-optimization/19903 (ACATS cxa4006 cxa4017 fail at runtime) PR tree-optimization/19903 * tree-chrec.c (chrec_convert): Return chrec_dont_know for constants that don't fit in their type after conversion. Co-Authored-By: Sebastian Pop From-SVN: r97607 --- gcc/tree-chrec.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) (limited to 'gcc/tree-chrec.c') diff --git a/gcc/tree-chrec.c b/gcc/tree-chrec.c index a360301..b6276e9 100644 --- a/gcc/tree-chrec.c +++ b/gcc/tree-chrec.c @@ -1002,7 +1002,23 @@ nb_vars_in_chrec (tree chrec) -/* Convert the initial condition of chrec to type. */ +/* Convert CHREC to TYPE. The following is rule is always true: + TREE_TYPE (chrec) == TREE_TYPE (CHREC_LEFT (chrec)) == TREE_TYPE + (CHREC_RIGHT (chrec)). An example of what could happen when adding + two chrecs and the type of the CHREC_RIGHT is different than + CHREC_LEFT is: + + {(uint) 0, +, (uchar) 10} + + {(uint) 0, +, (uchar) 250} + + that would produce a wrong result if CHREC_RIGHT is not (uint): + + {(uint) 0, +, (uchar) 4} + + instead of + + {(uint) 0, +, (uint) 260} +*/ tree chrec_convert (tree type, @@ -1037,6 +1053,18 @@ chrec_convert (tree type, TREE_OVERFLOW (res) = 0; if (CONSTANT_CLASS_P (res)) TREE_CONSTANT_OVERFLOW (res) = 0; + + /* But reject constants that don't fit in their type after conversion. + This can happen if TYPE_MIN_VALUE or TYPE_MAX_VALUE are not the + natural values associated with TYPE_PRECISION and TYPE_UNSIGNED, + and can cause problems later when computing niters of loops. Note + that we don't do the check before converting because we don't want + to reject conversions of negative chrecs to unsigned types. */ + if (TREE_CODE (res) == INTEGER_CST + && TREE_CODE (type) == INTEGER_TYPE + && !int_fits_type_p (res, type)) + res = chrec_dont_know; + return res; } } -- cgit v1.1