From 4061c1a39342c6dc6ff372a9e05d206acad4fac5 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 13 Mar 2002 08:41:45 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/loop.c | 7 ++++--- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.c-torture/compile/20020309-2.c | 16 ++++++++++++++++ 4 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/20020309-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 39de91fe4c3..5bd8a31badf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-03-13 Jakub Jelinek + + * loop.c (basic_induction_var): Don't call convert_modes if mode + classes are different. + 2002-03-12 Richard Henderson PR optimization/5901 diff --git a/gcc/loop.c b/gcc/loop.c index 3108b032498..6617608cfd3 100644 --- a/gcc/loop.c +++ b/gcc/loop.c @@ -6214,10 +6214,11 @@ basic_induction_var (loop, x, mode, dest_reg, p, inc_val, mult_val, location) case CONST: /* 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 - 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 - && GET_MODE_CLASS (mode) != MODE_CC - && GET_MODE_CLASS (GET_MODE (dest_reg)) != MODE_CC) + && GET_MODE_CLASS (mode) == GET_MODE_CLASS (GET_MODE (dest_reg)) + && GET_MODE_CLASS (mode) != MODE_CC) { /* Possible bug here? Perhaps we don't know the mode of X. */ *inc_val = convert_modes (GET_MODE (dest_reg), mode, x, 0); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cde8e627840..9d552202641 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2002-03-13 Jakub Jelinek + + * gcc.c-torture/compile/20020309-2.c: New test. + 2002-03-12 Nathan Sidwell * g++.dg/other/access1.C: New test. diff --git a/gcc/testsuite/gcc.c-torture/compile/20020309-2.c b/gcc/testsuite/gcc.c-torture/compile/20020309-2.c new file mode 100644 index 00000000000..77699e43d3d --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20020309-2.c @@ -0,0 +1,16 @@ +/* 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; +} -- 2.30.2