aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorZdenek Dvorak <dvorakz@suse.cz>2005-07-06 10:13:13 +0200
committerZdenek Dvorak <rakdver@gcc.gnu.org>2005-07-06 08:13:13 +0000
commitc456a94a49c9497da22209bb479c63487bb93c7c (patch)
tree04592b2f7cfbe276bd8ac4b72b20646f3a01753d /gcc
parent8ec11fe9b8b04468e81549ca68d5e70912b8f6dc (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/tree-ssa-loop-ivopts.c16
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;