aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-01-16 22:53:09 +0000
committerJakub Jelinek <jakub@redhat.com>2011-01-16 22:53:09 +0000
commitff3d7866da3431e92bcf6dae905809d16b033707 (patch)
tree29cd778a4a31d601908f13929c48c4738d4ea181
parent1f4b200fa3ba777d227a527f6255a0f1482ada71 (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/ChangeLog11
-rw-r--r--gcc/jump.c8
-rw-r--r--gcc/rtl.c10
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/gcc.target/i386/pr46865-1.c31
-rw-r--r--gcc/testsuite/gcc.target/i386/pr46865-2.c32
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 } } */