From 3a984f1011711044bc57484f7303230eef4b2d85 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 22 Jan 2013 17:41:30 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/config/i386/i386.md | 16 +++++++++++----- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.target/i386/pr55686.c | 16 ++++++++++++++++ 4 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr55686.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 79054466dbe..fa4def9bddc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2013-01-22 Jakub Jelinek + + 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 PR c++/56067 diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 531b62d8b2a..96f6dcd5929 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 c3d6f9eefe5..f3694db3ecc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-01-22 Jakub Jelinek + + PR target/55686 + * gcc.target/i386/pr55686.c: New test. + 2013-01-22 Dodji Seketeli 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 00000000000..a263b08dd71 --- /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; +}