On Sat, Jun 04, 2011 at 08:19:57AM -0700, H.J. Lu wrote: > I don't think this pattern is correct. See: > > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49281
Fixed thusly, committed as obvious: 2011-06-04 Jakub Jelinek <[email protected]> PR target/49281 * config/i386/i386.md (*lea_general_4): Require INTVAL (operands[3]) to be strictly smaller than 1 << shiftcount. * gcc.c-torture/execute/pr49281.c: New test. --- gcc/config/i386/i386.md.jj 2011-06-01 10:20:02.000000000 +0200 +++ gcc/config/i386/i386.md 2011-06-04 17:21:02.000000000 +0200 @@ -6425,7 +6425,7 @@ (define_insn_and_split "*lea_general_4" || optimize_function_for_size_p (cfun)) && ((unsigned HOST_WIDE_INT) INTVAL (operands[2])) - 1 < 3 && ((unsigned HOST_WIDE_INT) INTVAL (operands[3]) - <= ((unsigned HOST_WIDE_INT) 1 << INTVAL (operands[2])))" + < ((unsigned HOST_WIDE_INT) 1 << INTVAL (operands[2])))" "#" "&& reload_completed" [(const_int 0)] --- gcc/testsuite/gcc.c-torture/execute/pr49281.c.jj 2011-06-04 17:29:39.000000000 +0200 +++ gcc/testsuite/gcc.c-torture/execute/pr49281.c 2011-06-04 17:32:05.000000000 +0200 @@ -0,0 +1,25 @@ +/* PR target/49281 */ + +extern void abort (void); + +__attribute__((noinline, noclone)) int +foo (int x) +{ + return (x << 2) | 4; +} + +__attribute__((noinline, noclone)) int +bar (int x) +{ + return (x << 2) | 3; +} + +int +main () +{ + if (foo (43) != 172 || foo (1) != 4 || foo (2) != 12) + abort (); + if (bar (43) != 175 || bar (1) != 7 || bar (2) != 11) + abort (); + return 0; +} Jakub
