aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2013-01-22 17:41:30 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2013-01-22 17:41:30 +0100
commit3a984f1011711044bc57484f7303230eef4b2d85 (patch)
tree952d790c8ff351b2705d8cf230012c8ecb48f326 /gcc
parent904812578d14a5f06cd294b5398e8bb2a237c031 (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/i386/i386.md16
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr55686.c16
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;
+}