From: Jakub Jelinek Date: Sat, 4 Jun 2011 15:38:36 +0000 (+0200) Subject: re PR target/49281 (lea_general_4 is wrong) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=407bcba7b77ef3097651aa3a72b7f14b0fe5dfa2;p=gcc.git re PR target/49281 (lea_general_4 is wrong) 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. From-SVN: r174641 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3306765661f..926e1b8f1fd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-06-04 Jakub Jelinek + + PR target/49281 + * config/i386/i386.md (*lea_general_4): Require INTVAL (operands[3]) + to be strictly smaller than 1 << shiftcount. + 2011-06-04 Jan Hubicka PR tree-optimize/48929 diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 739580cda35..9702473eb1a 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -6419,7 +6419,7 @@ || 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)] diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 05efca005b4..483bffc6dd2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-06-04 Jakub Jelinek + + PR target/49281 + * gcc.c-torture/execute/pr49281.c: New test. + 2011-06-04 Jan Hubicka PR tree-optimize/48929 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr49281.c b/gcc/testsuite/gcc.c-torture/execute/pr49281.c new file mode 100644 index 00000000000..75f5314116a --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr49281.c @@ -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; +}