diff options
author | Jakub Jelinek <jakub@redhat.com> | 2013-01-22 17:41:30 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-01-22 17:41:30 +0100 |
commit | 3a984f1011711044bc57484f7303230eef4b2d85 (patch) | |
tree | 952d790c8ff351b2705d8cf230012c8ecb48f326 | |
parent | 904812578d14a5f06cd294b5398e8bb2a237c031 (diff) | |
download | gcc-3a984f1011711044bc57484f7303230eef4b2d85.zip gcc-3a984f1011711044bc57484f7303230eef4b2d85.tar.gz gcc-3a984f1011711044bc57484f7303230eef4b2d85.tar.bz2 |
re PR rtl-optimization/55686 (ICE in assign_by_spills, at lra-assigns.c:1244)
PR target/55686
* config/i386/i386.md (UNSPEC_STOS): New.
(strset_singleop, *strsetdi_rex_1, *strsetsi_1, *strsethi_1,
*strsetqi_1): Add UNSPEC_STOS.
* gcc.target/i386/pr55686.c: New test.
From-SVN: r195381
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 16 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr55686.c | 16 |
4 files changed, 39 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7905446..fa4def9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2013-01-22 Jakub Jelinek <jakub@redhat.com> + + PR target/55686 + * config/i386/i386.md (UNSPEC_STOS): New. + (strset_singleop, *strsetdi_rex_1, *strsetsi_1, *strsethi_1, + *strsetqi_1): Add UNSPEC_STOS. + 2013-01-22 Paolo Carlini <paolo.carlini@oracle.com> PR c++/56067 diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 531b62d..96f6dcd 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -110,6 +110,7 @@ UNSPEC_PAUSE UNSPEC_LEA_ADDR UNSPEC_XBEGIN_ABORT + UNSPEC_STOS ;; For SSE/MMX support: UNSPEC_FIX_NOTRUNC @@ -15607,7 +15608,8 @@ [(parallel [(set (match_operand 1 "memory_operand") (match_operand 2 "register_operand")) (set (match_operand 0 "register_operand") - (match_operand 3))])] + (match_operand 3)) + (unspec [(const_int 0)] UNSPEC_STOS)])] "" "ix86_current_function_needs_cld = 1;") @@ -15616,7 +15618,8 @@ (match_operand:DI 2 "register_operand" "a")) (set (match_operand:P 0 "register_operand" "=D") (plus:P (match_dup 1) - (const_int 8)))] + (const_int 8))) + (unspec [(const_int 0)] UNSPEC_STOS)] "TARGET_64BIT && !(fixed_regs[AX_REG] || fixed_regs[DI_REG])" "%^stosq" @@ -15629,7 +15632,8 @@ (match_operand:SI 2 "register_operand" "a")) (set (match_operand:P 0 "register_operand" "=D") (plus:P (match_dup 1) - (const_int 4)))] + (const_int 4))) + (unspec [(const_int 0)] UNSPEC_STOS)] "!(fixed_regs[AX_REG] || fixed_regs[DI_REG])" "%^stos{l|d}" [(set_attr "type" "str") @@ -15641,7 +15645,8 @@ (match_operand:HI 2 "register_operand" "a")) (set (match_operand:P 0 "register_operand" "=D") (plus:P (match_dup 1) - (const_int 2)))] + (const_int 2))) + (unspec [(const_int 0)] UNSPEC_STOS)] "!(fixed_regs[AX_REG] || fixed_regs[DI_REG])" "%^stosw" [(set_attr "type" "str") @@ -15653,7 +15658,8 @@ (match_operand:QI 2 "register_operand" "a")) (set (match_operand:P 0 "register_operand" "=D") (plus:P (match_dup 1) - (const_int 1)))] + (const_int 1))) + (unspec [(const_int 0)] UNSPEC_STOS)] "!(fixed_regs[AX_REG] || fixed_regs[DI_REG])" "%^stosb" [(set_attr "type" "str") diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c3d6f9e..f3694db 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-01-22 Jakub Jelinek <jakub@redhat.com> + + PR target/55686 + * gcc.target/i386/pr55686.c: New test. + 2013-01-22 Dodji Seketeli <dodji@redhat.com> PR c++/53609 diff --git a/gcc/testsuite/gcc.target/i386/pr55686.c b/gcc/testsuite/gcc.target/i386/pr55686.c new file mode 100644 index 0000000..a263b08 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr55686.c @@ -0,0 +1,16 @@ +/* PR target/55686 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +void +foo (long x, long *y) +{ + long *a = y - 64, i; + for (i = 0; i < x; i++) + { + long v = y[i]; + *a++ = v; + } + register void **c __asm__ ("di"); + goto **c; +} |