diff options
author | Jakub Jelinek <jakub@redhat.com> | 2005-05-03 14:58:11 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2005-05-03 14:58:11 +0200 |
commit | 85b583d30a6f23f17bddcabfd700239ca9e10299 (patch) | |
tree | a0bbe9ce6eeea2b2cc92288fa6b7a79d76cbe14d | |
parent | f47c96aac54c7d7b5e0855e1b52419435268d61f (diff) | |
download | gcc-85b583d30a6f23f17bddcabfd700239ca9e10299.zip gcc-85b583d30a6f23f17bddcabfd700239ca9e10299.tar.gz gcc-85b583d30a6f23f17bddcabfd700239ca9e10299.tar.bz2 |
re PR target/21297 (buf[i+i]=0 stores buf[i] when -O2)
PR target/21297
* config/i386/i386.c (legitimize_address): When canonicalizing
ASHIFT into MULT, multiply by 1 << shift_count instead of
1 << log2 (shift_count).
* gcc.c-torture/execute/20050502-2.c: New test.
From-SVN: r99156
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/20050502-2.c | 34 |
4 files changed, 52 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7aecc48..8fa6e4c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2005-05-03 Jakub Jelinek <jakub@redhat.com> + + PR target/21297 + * config/i386/i386.c (legitimize_address): When canonicalizing + ASHIFT into MULT, multiply by 1 << shift_count instead of + 1 << log2 (shift_count). + 2005-05-03 Andrew MacLeod <amacleod@redhat.com> * lambda-code.c (gcc_loop_to_lambda_loop, diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 110b233..ea10926 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -5902,9 +5902,10 @@ legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, enum machine_mode mode) /* Canonicalize shifts by 0, 1, 2, 3 into multiply */ if (GET_CODE (x) == ASHIFT && GET_CODE (XEXP (x, 1)) == CONST_INT - && (log = (unsigned) exact_log2 (INTVAL (XEXP (x, 1)))) < 4) + && (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) < 4) { changed = 1; + log = INTVAL (XEXP (x, 1)); x = gen_rtx_MULT (Pmode, force_reg (Pmode, XEXP (x, 0)), GEN_INT (1 << log)); } @@ -5915,9 +5916,10 @@ legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, enum machine_mode mode) if (GET_CODE (XEXP (x, 0)) == ASHIFT && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT - && (log = (unsigned) exact_log2 (INTVAL (XEXP (XEXP (x, 0), 1)))) < 4) + && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (x, 0), 1)) < 4) { changed = 1; + log = INTVAL (XEXP (XEXP (x, 0), 1)); XEXP (x, 0) = gen_rtx_MULT (Pmode, force_reg (Pmode, XEXP (XEXP (x, 0), 0)), GEN_INT (1 << log)); @@ -5925,9 +5927,10 @@ legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, enum machine_mode mode) if (GET_CODE (XEXP (x, 1)) == ASHIFT && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT - && (log = (unsigned) exact_log2 (INTVAL (XEXP (XEXP (x, 1), 1)))) < 4) + && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (x, 1), 1)) < 4) { changed = 1; + log = INTVAL (XEXP (XEXP (x, 1), 1)); XEXP (x, 1) = gen_rtx_MULT (Pmode, force_reg (Pmode, XEXP (XEXP (x, 1), 0)), GEN_INT (1 << log)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ede71cb..b6b3ce6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-05-03 Jakub Jelinek <jakub@redhat.com> + + PR target/21297 + * gcc.c-torture/execute/20050502-2.c: New test. + 2005-05-03 Uros Bizjak <uros@kss-loka.si> PR middle-end/21282 diff --git a/gcc/testsuite/gcc.c-torture/execute/20050502-2.c b/gcc/testsuite/gcc.c-torture/execute/20050502-2.c new file mode 100644 index 0000000..eedcb6a --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20050502-2.c @@ -0,0 +1,34 @@ +/* PR target/21297 */ +typedef __SIZE_TYPE__ size_t; +extern int memcmp (const char *, const char *, size_t); +extern void abort (); + +void +foo (char *x) +{ + int i; + for (i = 0; i < 2; i++); + x[i + i] = '\0'; +} + +void +bar (char *x) +{ + int i; + for (i = 0; i < 2; i++); + x[i + i + i + i] = '\0'; +} + +int +main (void) +{ + char x[] = "IJKLMNOPQR"; + foo (x); + if (memcmp (x, "IJKL\0NOPQR", sizeof x) != 0) + abort (); + x[4] = 'M'; + bar (x); + if (memcmp (x, "IJKLMNOP\0R", sizeof x) != 0) + abort (); + return 0; +} |