diff options
author | Zdenek Dvorak <dvorakz@suse.cz> | 2005-07-06 10:13:13 +0200 |
---|---|---|
committer | Zdenek Dvorak <rakdver@gcc.gnu.org> | 2005-07-06 08:13:13 +0000 |
commit | c456a94a49c9497da22209bb479c63487bb93c7c (patch) | |
tree | 04592b2f7cfbe276bd8ac4b72b20646f3a01753d /gcc | |
parent | 8ec11fe9b8b04468e81549ca68d5e70912b8f6dc (diff) | |
download | gcc-c456a94a49c9497da22209bb479c63487bb93c7c.zip gcc-c456a94a49c9497da22209bb479c63487bb93c7c.tar.gz gcc-c456a94a49c9497da22209bb479c63487bb93c7c.tar.bz2 |
re PR tree-optimization/21963 (ICE (seg fault) with -m64 (in IV-OPTS))
PR tree-optimization/21963
* tree-ssa-loop-ivopts.c (get_computation_aff): Use
constant_multiple_of in the same way get_computation_cost_at does.
From-SVN: r101654
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-ivopts.c | 16 |
2 files changed, 17 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4343b43..a85f3d1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-07-06 Zdenek Dvorak <dvorakz@suse.cz> + + PR tree-optimization/21963 + * tree-ssa-loop-ivopts.c (get_computation_aff): Use + constant_multiple_of in the same way get_computation_cost_at does. + 2005-07-06 Jakub Jelinek <jakub@redhat.com> * config/sparc/sparc.h (sparc_compare_emitted): New extern. diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index acc1ae9..8e6b8c1 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -2983,6 +2983,7 @@ get_computation_aff (struct loop *loop, unsigned HOST_WIDE_INT ustepi, cstepi; HOST_WIDE_INT ratioi; struct affine_tree_combination cbase_aff, expr_aff; + tree cstep_orig = cstep, ustep_orig = ustep; if (TYPE_PRECISION (utype) > TYPE_PRECISION (ctype)) { @@ -3012,13 +3013,18 @@ get_computation_aff (struct loop *loop, expr = fold_convert (uutype, expr); cbase = fold_convert (uutype, cbase); cstep = fold_convert (uutype, cstep); + + /* If the conversion is not noop, we must take it into account when + considering the value of the step. */ + if (TYPE_PRECISION (utype) < TYPE_PRECISION (ctype)) + cstep_orig = cstep; } - if (cst_and_fits_in_hwi (cstep) - && cst_and_fits_in_hwi (ustep)) + if (cst_and_fits_in_hwi (cstep_orig) + && cst_and_fits_in_hwi (ustep_orig)) { - ustepi = int_cst_value (ustep); - cstepi = int_cst_value (cstep); + ustepi = int_cst_value (ustep_orig); + cstepi = int_cst_value (cstep_orig); if (!divide (TYPE_PRECISION (uutype), ustepi, cstepi, &ratioi)) { @@ -3032,7 +3038,7 @@ get_computation_aff (struct loop *loop, } else { - ratio = constant_multiple_of (uutype, ustep, cstep); + ratio = constant_multiple_of (uutype, ustep_orig, cstep_orig); if (!ratio) return false; |