summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/i386.md10
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/20030204-1.c16
4 files changed, 33 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ee7f50da2cc..e01c74d7213 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2003-02-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR optimization/8555
+ * config/i386/i386.md (sse_mov?fcc split): Handle op2 == op3 case
+ instead of aborting.
+
2003-02-04 Richard Henderson <rth@redhat.com>
* config/i386/i386.md (UNSPEC_BSF): Remove.
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index ffb2153bf3b..a1eb241d45e 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -17127,10 +17127,14 @@
op = simplify_gen_subreg (V2DFmode, operands[3], DFmode, 0);
emit_insn (gen_sse2_unpcklpd (op, op, op));
}
- /* If op2 == op3, op3 will be clobbered before it is used.
- This should be optimized out though. */
+
+ /* If op2 == op3, op3 would be clobbered before it is used. */
if (operands_match_p (operands[2], operands[3]))
- abort ();
+ {
+ emit_move_insn (operands[0], operands[2]);
+ DONE;
+ }
+
PUT_MODE (operands[1], GET_MODE (operands[0]));
if (operands_match_p (operands[0], operands[4]))
operands[6] = operands[4], operands[7] = operands[2];
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 861cc283bba..4d553c6f305 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2003-02-05 Jakub Jelinek <jakub@redhat.com>
+
+ * gcc.dg/20030204-1.c: New test.
+
2003-02-04 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/38
diff --git a/gcc/testsuite/gcc.dg/20030204-1.c b/gcc/testsuite/gcc.dg/20030204-1.c
new file mode 100644
index 00000000000..e236e3a3a39
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/20030204-1.c
@@ -0,0 +1,16 @@
+/* PR optimization/8555 */
+/* { dg-do compile } */
+/* { dg-options "-O -ffast-math -funroll-loops" } */
+/* { dg-options "-march=pentium3 -O -ffast-math -funroll-loops" { target i?86-*-* } } */
+
+float foo (float *a, int i)
+{
+ int j;
+ float x = a[j = i - 1], y;
+
+ for (j = i; --j >= 0; )
+ if ((y = a[j]) > x)
+ x = y;
+
+ return x;
+}