diff options
author | Jakub Jelinek <jakub@redhat.com> | 2003-02-05 12:29:15 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2003-02-05 12:29:15 +0100 |
commit | 4f6ae35d12e716c1b596cbe979066730be91fc58 (patch) | |
tree | 8869d5370251e1a12637976c0f2dc56ebedf89c4 /gcc | |
parent | 8acfdd43da580ac54e7c86334d24d2b3e8b2585e (diff) | |
download | gcc-4f6ae35d12e716c1b596cbe979066730be91fc58.zip gcc-4f6ae35d12e716c1b596cbe979066730be91fc58.tar.gz gcc-4f6ae35d12e716c1b596cbe979066730be91fc58.tar.bz2 |
re PR rtl-optimization/8555 (ICE in gen_split_1231)
PR optimization/8555
* config/i386/i386.md (sse_mov?fcc split): Handle op2 == op3 case
instead of aborting.
* gcc.dg/20030204-1.c: New test.
From-SVN: r62438
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/20030204-1.c | 16 |
4 files changed, 33 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ee7f50d..e01c74d 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 ffb2153..a1eb241 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 861cc28..4d553c6 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 0000000..e236e3a --- /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; +} |