Commit 4061c1a3 by Jakub Jelinek Committed by Jakub Jelinek

loop.c (basic_induction_var): Don't call convert_modes if mode classes are different.

	* loop.c (basic_induction_var): Don't call convert_modes if mode
	classes are different.

	* gcc.c-torture/compile/20020309-2.c: New test.

From-SVN: r50721
parent 9f53e965
2002-03-13 Jakub Jelinek <jakub@redhat.com>
* loop.c (basic_induction_var): Don't call convert_modes if mode
classes are different.
2002-03-12 Richard Henderson <rth@redhat.com> 2002-03-12 Richard Henderson <rth@redhat.com>
PR optimization/5901 PR optimization/5901
......
...@@ -6214,10 +6214,11 @@ basic_induction_var (loop, x, mode, dest_reg, p, inc_val, mult_val, location) ...@@ -6214,10 +6214,11 @@ basic_induction_var (loop, x, mode, dest_reg, p, inc_val, mult_val, location)
case CONST: case CONST:
/* convert_modes aborts if we try to convert to or from CCmode, so just /* convert_modes aborts if we try to convert to or from CCmode, so just
exclude that case. It is very unlikely that a condition code value exclude that case. It is very unlikely that a condition code value
would be a useful iterator anyways. */ would be a useful iterator anyways. convert_modes aborts if we try to
convert a float mode to non-float or vice versa too. */
if (loop->level == 1 if (loop->level == 1
&& GET_MODE_CLASS (mode) != MODE_CC && GET_MODE_CLASS (mode) == GET_MODE_CLASS (GET_MODE (dest_reg))
&& GET_MODE_CLASS (GET_MODE (dest_reg)) != MODE_CC) && GET_MODE_CLASS (mode) != MODE_CC)
{ {
/* Possible bug here? Perhaps we don't know the mode of X. */ /* Possible bug here? Perhaps we don't know the mode of X. */
*inc_val = convert_modes (GET_MODE (dest_reg), mode, x, 0); *inc_val = convert_modes (GET_MODE (dest_reg), mode, x, 0);
......
2002-03-13 Jakub Jelinek <jakub@redhat.com>
* gcc.c-torture/compile/20020309-2.c: New test.
2002-03-12 Nathan Sidwell <nathan@codesourcery.com> 2002-03-12 Nathan Sidwell <nathan@codesourcery.com>
* g++.dg/other/access1.C: New test. * g++.dg/other/access1.C: New test.
......
/* This testcase ICEd on IA-32 at -O2, because loop was calling convert_modes
between a MODE_FLOAT and MODE_INT class modes. */
typedef union
{
double d;
long long ll;
} A;
void
foo (A x, A **y, A z)
{
for (; *y; y++)
if (x.ll == 262 && (*y)->d == z.d)
break;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment