diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ed331ad456fc..439ad0bb180c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2010-12-10 Jakub Jelinek + PR rtl-optimization/46865 + * rtl.c (rtx_equal_p_cb, rtx_equal_p): For last operand of + ASM_OPERANDS and ASM_INPUT if integers are different, + call locator_eq. + * jump.c (rtx_renumbered_equal_p): Likewise. + PR tree-optimization/46864 * tree-ssa-loop-im.c (loop_suitable_for_sm): Return false even when there are EDGE_EH exit edges. diff --git a/gcc/jump.c b/gcc/jump.c index 928bb810ab9e..b85326adeebc 100644 --- a/gcc/jump.c +++ b/gcc/jump.c @@ -1727,7 +1727,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 == 6) + || (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 6f349798c752..878446c3070d 100644 --- a/gcc/rtl.c +++ b/gcc/rtl.c @@ -431,7 +431,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 == 6) + || (code == ASM_INPUT && i == 1)) + && locator_eq (XINT (x, i), XINT (y, i))) + break; +#endif + return 0; + } break; case 'V': @@ -555,7 +563,15 @@ rtx_equal_p (const_rtx x, const_rtx y) case 'n': case 'i': if (XINT (x, i) != XINT (y, i)) - return 0; + { +#ifndef GENERATOR_FILE + if (((code == ASM_OPERANDS && i == 6) + || (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 63a3a48a06f7..ed62e945c041 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2010-12-10 Jakub Jelinek + PR rtl-optimization/46865 + * gcc.target/i386/pr46865-1.c: New test. + * gcc.target/i386/pr46865-2.c: New test. + PR tree-optimization/46864 * g++.dg/opt/pr46864.C: New test. 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 000000000000..220a1c0778bb --- /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 000000000000..4a91f7c962be --- /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 } } */