re PR target/47800 (i?86 peephole related ICE)
authorJakub Jelinek <jakub@redhat.com>
Sat, 19 Feb 2011 11:23:02 +0000 (12:23 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 19 Feb 2011 11:23:02 +0000 (12:23 +0100)
PR target/47800
* config/i386/i386.md (peephole2 for shift and plus): Use
operands[1] original mode in the first insn.

* gcc.target/i386/pr47800.c: New test.

From-SVN: r170311

gcc/ChangeLog
gcc/config/i386/i386.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr47800.c [new file with mode: 0644]

index 30c524a3887335c791c78410439656f17fbf61a2..c5bd191386fed0d75adb82565e2ed55b57be56cf 100644 (file)
@@ -1,3 +1,9 @@
+2011-02-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/47800
+       * config/i386/i386.md (peephole2 for shift and plus): Use
+       operands[1] original mode in the first insn.
+
 2011-02-18  Mike Stump  <mikestump@comcast.net>
 
        * config/t-darwin (TM_H): Add dependency on darwin-sections.def.
index 1f14f5ce4d778654724966ede035db178a641faa..a17ab7aceeeeb011070ad658d3393fff806cce53 100644 (file)
@@ -1,6 +1,6 @@
 ;; GCC machine description for IA-32 and x86-64.
 ;; Copyright (C) 1988, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-;; 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+;; 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
 ;; Free Software Foundation, Inc.
 ;; Mostly by William Schelter.
 ;; x86_64 support added by Jan Hubicka
                   (plus (match_dup 0)
                         (match_operand 4 "x86_64_general_operand" "")))
                   (clobber (reg:CC FLAGS_REG))])]
-  "INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) <= 3
+  "IN_RANGE (INTVAL (operands[2]), 1, 3)
    /* Validate MODE for lea.  */
    && ((!TARGET_PARTIAL_REG_STALL
        && (GET_MODE (operands[0]) == QImode
   [(set (match_dup 5) (match_dup 4))
    (set (match_dup 0) (match_dup 1))]
 {
-  enum machine_mode mode = GET_MODE (operands[1]) == DImode ? DImode : SImode;
+  enum machine_mode op1mode = GET_MODE (operands[1]);
+  enum machine_mode mode = op1mode == DImode ? DImode : SImode;
   int scale = 1 << INTVAL (operands[2]);
   rtx index = gen_lowpart (Pmode, operands[1]);
   rtx base = gen_lowpart (Pmode, operands[5]);
                              gen_rtx_MULT (Pmode, index, GEN_INT (scale)));
   operands[5] = base;
   if (mode != Pmode)
-    {
-      operands[1] = gen_rtx_SUBREG (mode, operands[1], 0);
-      operands[5] = gen_rtx_SUBREG (mode, operands[5], 0);
-    }
+    operands[1] = gen_rtx_SUBREG (mode, operands[1], 0);
+  if (op1mode != Pmode)
+    operands[5] = gen_rtx_SUBREG (op1mode, operands[5], 0);
   operands[0] = dest;
 })
 \f
index 8dc3c71ec8856ae55c993830b1d3fe9b84489ea5..be5a00686eee3d0b9a5791a2432d4fb7809dd629 100644 (file)
@@ -1,3 +1,8 @@
+2011-02-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/47800
+       * gcc.target/i386/pr47800.c: New test.
+
 2011-02-18  Iain Sandoe  <iains@gcc.gnu.org>
 
        * objc/execute/exceptions/foward-1.x: New.
diff --git a/gcc/testsuite/gcc.target/i386/pr47800.c b/gcc/testsuite/gcc.target/i386/pr47800.c
new file mode 100644 (file)
index 0000000..45c817b
--- /dev/null
@@ -0,0 +1,15 @@
+/* PR target/47800 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=nocona" } */
+
+int
+foo (unsigned char *x, unsigned char *y)
+{
+  unsigned char a;
+  for (a = 0; x < y; x++)
+    if (a & 0x80)
+      a = (unsigned char) (a << 1) + 1 + *x;
+    else
+      a = (unsigned char) (a << 1) + *x;
+  return a;
+}