diff options
| author | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-04-21 20:58:05 +0000 |
|---|---|---|
| committer | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-04-21 20:58:05 +0000 |
| commit | 601e16665d2dd92919e97e0c43abca94a713885a (patch) | |
| tree | b5d1e352f5810d0e19651682c96a3da77f186d46 /gcc/fold-const.c | |
| parent | ac068b11a231d1b131fca795af8f37306e9ba4e8 (diff) | |
| download | ppe42-gcc-601e16665d2dd92919e97e0c43abca94a713885a.tar.gz ppe42-gcc-601e16665d2dd92919e97e0c43abca94a713885a.zip | |
* fold-const.c (extract_muldiv, case CONVERT_EXPR): Detect case
when conversion overflows.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@65900 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fold-const.c')
| -rw-r--r-- | gcc/fold-const.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index fa64fd2b956..146f40f97ac 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -4182,8 +4182,12 @@ extract_muldiv_1 (t, c, code, wide_type) /* Pass the constant down and see if we can make a simplification. If we can, replace this expression with the inner simplification for possible later conversion to our or some other type. */ - if (0 != (t1 = extract_muldiv (op0, convert (TREE_TYPE (op0), c), code, - code == MULT_EXPR ? ctype : NULL_TREE))) + if ((t2 = convert (TREE_TYPE (op0), c)) != 0 + && TREE_CODE (t2) == INTEGER_CST + && ! TREE_CONSTANT_OVERFLOW (t2) + && (0 != (t1 = extract_muldiv (op0, t2, code, + code == MULT_EXPR + ? ctype : NULL_TREE)))) return t1; break; @@ -5478,13 +5482,17 @@ fold (expr) if (TREE_CODE (parg0) == MULT_EXPR && TREE_CODE (parg1) != MULT_EXPR) return fold (build (PLUS_EXPR, type, - fold (build (PLUS_EXPR, type, parg0, marg)), - parg1)); + fold (build (PLUS_EXPR, type, + convert (type, parg0), + convert (type, marg))), + convert (type, parg1))); if (TREE_CODE (parg0) != MULT_EXPR && TREE_CODE (parg1) == MULT_EXPR) return fold (build (PLUS_EXPR, type, - fold (build (PLUS_EXPR, type, parg1, marg)), - parg0)); + fold (build (PLUS_EXPR, type, + convert (type, parg1), + convert (type, marg))), + convert (type, parg0))); } if (TREE_CODE (arg0) == MULT_EXPR && TREE_CODE (arg1) == MULT_EXPR) @@ -5816,7 +5824,8 @@ fold (expr) TREE_OPERAND (arg0, 1))); if (TREE_CODE (arg1) == INTEGER_CST - && 0 != (tem = extract_muldiv (TREE_OPERAND (t, 0), arg1, + && 0 != (tem = extract_muldiv (TREE_OPERAND (t, 0), + convert (type, arg1), code, NULL_TREE))) return convert (type, tem); |

