]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/21963 (ICE (seg fault) with -m64 (in IV-OPTS))
authorZdenek Dvorak <dvorakz@suse.cz>
Wed, 6 Jul 2005 08:13:13 +0000 (10:13 +0200)
committerZdenek Dvorak <rakdver@gcc.gnu.org>
Wed, 6 Jul 2005 08:13:13 +0000 (08:13 +0000)
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

gcc/ChangeLog
gcc/tree-ssa-loop-ivopts.c

index 4343b436a5b961d9fafc3a33b70fab50af598ea2..a85f3d1fc7e162bd364957d77c36c46c3a6d1bf4 100644 (file)
@@ -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.
index acc1ae9c4f0dd33d70be2390252a300b3138e52b..8e6b8c168d41cf64bdb23ae75b928de32116e2fa 100644 (file)
@@ -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;