From c4cdbeb4802cec34a912e343629d8e28b20128c7 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Tue, 5 Apr 2005 09:06:23 +0200 Subject: [PATCH] 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/ChangeLog | 7 +++++++ gcc/tree-chrec.c | 30 +++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9f3a372f713..bbbade7f706 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2005-04-05 Eric Botcazou + Sebastian Pop + + PR tree-optimization/19903 + * tree-chrec.c (chrec_convert): Return chrec_dont_know for constants + that don't fit in their type after conversion. + 2005-04-05 Uros Bizjak PR target/20421 diff --git a/gcc/tree-chrec.c b/gcc/tree-chrec.c index a360301d53e..b6276e929fd 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; } } -- 2.30.2