Commit 9215ddc3 by Jakub Jelinek Committed by Jakub Jelinek

re PR target/47800 (i?86 peephole related ICE)

	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
parent 65ded153
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> 2011-02-18 Mike Stump <mikestump@comcast.net>
* config/t-darwin (TM_H): Add dependency on darwin-sections.def. * config/t-darwin (TM_H): Add dependency on darwin-sections.def.
......
;; GCC machine description for IA-32 and x86-64. ;; GCC machine description for IA-32 and x86-64.
;; Copyright (C) 1988, 1994, 1995, 1996, 1997, 1998, 1999, 2000, ;; 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. ;; Free Software Foundation, Inc.
;; Mostly by William Schelter. ;; Mostly by William Schelter.
;; x86_64 support added by Jan Hubicka ;; x86_64 support added by Jan Hubicka
...@@ -17461,7 +17461,7 @@ ...@@ -17461,7 +17461,7 @@
(plus (match_dup 0) (plus (match_dup 0)
(match_operand 4 "x86_64_general_operand" ""))) (match_operand 4 "x86_64_general_operand" "")))
(clobber (reg:CC FLAGS_REG))])] (clobber (reg:CC FLAGS_REG))])]
"INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) <= 3 "IN_RANGE (INTVAL (operands[2]), 1, 3)
/* Validate MODE for lea. */ /* Validate MODE for lea. */
&& ((!TARGET_PARTIAL_REG_STALL && ((!TARGET_PARTIAL_REG_STALL
&& (GET_MODE (operands[0]) == QImode && (GET_MODE (operands[0]) == QImode
...@@ -17475,7 +17475,8 @@ ...@@ -17475,7 +17475,8 @@
[(set (match_dup 5) (match_dup 4)) [(set (match_dup 5) (match_dup 4))
(set (match_dup 0) (match_dup 1))] (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]); int scale = 1 << INTVAL (operands[2]);
rtx index = gen_lowpart (Pmode, operands[1]); rtx index = gen_lowpart (Pmode, operands[1]);
rtx base = gen_lowpart (Pmode, operands[5]); rtx base = gen_lowpart (Pmode, operands[5]);
...@@ -17485,10 +17486,9 @@ ...@@ -17485,10 +17486,9 @@
gen_rtx_MULT (Pmode, index, GEN_INT (scale))); gen_rtx_MULT (Pmode, index, GEN_INT (scale)));
operands[5] = base; operands[5] = base;
if (mode != Pmode) if (mode != Pmode)
{ operands[1] = gen_rtx_SUBREG (mode, operands[1], 0);
operands[1] = gen_rtx_SUBREG (mode, operands[1], 0); if (op1mode != Pmode)
operands[5] = gen_rtx_SUBREG (mode, operands[5], 0); operands[5] = gen_rtx_SUBREG (op1mode, operands[5], 0);
}
operands[0] = dest; operands[0] = dest;
}) })
......
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> 2011-02-18 Iain Sandoe <iains@gcc.gnu.org>
* objc/execute/exceptions/foward-1.x: New. * objc/execute/exceptions/foward-1.x: New.
......
/* 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment