diff options
author | Jakub Jelinek <jakub@redhat.com> | 2011-01-16 22:53:09 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2011-01-16 22:53:09 +0000 |
commit | ff3d7866da3431e92bcf6dae905809d16b033707 (patch) | |
tree | 29cd778a4a31d601908f13929c48c4738d4ea181 | |
parent | 1f4b200fa3ba777d227a527f6255a0f1482ada71 (diff) |
Backport from mainline
2010-12-10 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/46865
* rtl.c (rtx_equal_p_cb): For last operand of
ASM_OPERANDS and ASM_INPUT if integers are different,
call locator_eq.
* jump.c (rtx_renumbered_equal_p): Likewise.
* gcc.target/i386/pr46865-1.c: New test.
* gcc.target/i386/pr46865-2.c: New test.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/gcc-4_4-branch@168877 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/jump.c | 8 | ||||
-rw-r--r-- | gcc/rtl.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr46865-1.c | 31 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr46865-2.c | 32 |
6 files changed, 99 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1b7f9e32998..f2d5b91d1f6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2011-01-16 Jakub Jelinek <jakub@redhat.com> + + Backport from mainline + 2010-12-10 Jakub Jelinek <jakub@redhat.com> + + PR rtl-optimization/46865 + * rtl.c (rtx_equal_p_cb): For last operand of + ASM_OPERANDS and ASM_INPUT if integers are different, + call locator_eq. + * jump.c (rtx_renumbered_equal_p): Likewise. + 2011-01-07 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> Backport from mainline: diff --git a/gcc/jump.c b/gcc/jump.c index 2b9a9545223..cc024a80e78 100644 --- a/gcc/jump.c +++ b/gcc/jump.c @@ -1670,7 +1670,13 @@ rtx_renumbered_equal_p (const_rtx x, const_rtx y) case 'i': if (XINT (x, i) != XINT (y, i)) - return 0; + { + if (((code == ASM_OPERANDS && i == 5) + || (code == ASM_INPUT && i == 1)) + && locator_eq (XINT (x, i), XINT (y, i))) + break; + return 0; + } break; case 't': diff --git a/gcc/rtl.c b/gcc/rtl.c index c275091ad77..09700d0b654 100644 --- a/gcc/rtl.c +++ b/gcc/rtl.c @@ -405,7 +405,15 @@ rtx_equal_p_cb (const_rtx x, const_rtx y, rtx_equal_p_callback_function cb) case 'n': case 'i': if (XINT (x, i) != XINT (y, i)) - return 0; + { +#ifndef GENERATOR_FILE + if (((code == ASM_OPERANDS && i == 5) + || (code == ASM_INPUT && i == 1)) + && locator_eq (XINT (x, i), XINT (y, i))) + break; +#endif + return 0; + } break; case 'V': diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3947ce58b02..15642229015 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2011-01-16 Jakub Jelinek <jakub@redhat.com> + + Backport from mainline + 2010-12-10 Jakub Jelinek <jakub@redhat.com> + + PR rtl-optimization/46865 + * gcc.target/i386/pr46865-1.c: New test. + * gcc.target/i386/pr46865-2.c: New test. + 2011-01-13 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> * gfortran.dg/cray_pointers_2.f90: Use dg-timeout-factor 4. diff --git a/gcc/testsuite/gcc.target/i386/pr46865-1.c b/gcc/testsuite/gcc.target/i386/pr46865-1.c new file mode 100644 index 00000000000..220a1c0778b --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr46865-1.c @@ -0,0 +1,31 @@ +/* PR rtl-optimization/46865 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +extern unsigned long f; + +#define m1(f) \ + if (f & 1) \ + asm volatile ("nop /* asmnop */\n"); \ + else \ + asm volatile ("nop /* asmnop */\n"); + +#define m2(f) \ + if (f & 1) \ + asm volatile ("nop /* asmnop */\n" : : "i" (6) : "cx"); \ + else \ + asm volatile ("nop /* asmnop */\n" : : "i" (6) : "cx"); + +void +foo (void) +{ + m1 (f); +} + +void +bar (void) +{ + m2 (f); +} + +/* { dg-final { scan-assembler-times "asmnop" 2 } } */ diff --git a/gcc/testsuite/gcc.target/i386/pr46865-2.c b/gcc/testsuite/gcc.target/i386/pr46865-2.c new file mode 100644 index 00000000000..4a91f7c962b --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr46865-2.c @@ -0,0 +1,32 @@ +/* PR rtl-optimization/46865 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -save-temps" } */ + +extern unsigned long f; + +#define m1(f) \ + if (f & 1) \ + asm volatile ("nop /* asmnop */\n"); \ + else \ + asm volatile ("nop /* asmnop */\n"); + +#define m2(f) \ + if (f & 1) \ + asm volatile ("nop /* asmnop */\n" : : "i" (6) : "cx"); \ + else \ + asm volatile ("nop /* asmnop */\n" : : "i" (6) : "cx"); + +void +foo (void) +{ + m1 (f); +} + +void +bar (void) +{ + m2 (f); +} + +/* { dg-final { scan-assembler-times "asmnop" 2 } } */ +/* { dg-final { cleanup-saved-temps } } */ |