summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/loop.c7
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20020309-2.c16
4 files changed, 29 insertions, 3 deletions
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 <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>
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 <jakub@redhat.com>
+
+ * gcc.c-torture/compile/20020309-2.c: New test.
+
2002-03-12 Nathan Sidwell <nathan@codesourcery.com>
* 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;
+}