aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-12-14 19:00:39 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2007-12-14 19:00:39 +0100
commit18117c0574ff93712f6b1710c5bdd70b68695637 (patch)
treec4441421464bc00c96de471a7e07b6a70025b6e9
parent05c219bb4943a1ebfc30df747e1d97897b3494a1 (diff)
downloadgcc-18117c0574ff93712f6b1710c5bdd70b68695637.zip
gcc-18117c0574ff93712f6b1710c5bdd70b68695637.tar.gz
gcc-18117c0574ff93712f6b1710c5bdd70b68695637.tar.bz2
re PR target/29978 (redundant jumps)
PR target/29978 * config/i386/i386.c (ix86_expand_branch): Optimize LE/LEU/GT/GTU DImode comparisons against constant with all 1's in the lower word. * gcc.target/i386/pr29978.c: New test. From-SVN: r130938
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/i386.c24
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr29978.c16
4 files changed, 45 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b006b49..0875708d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2007-12-14 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/29978
+ * config/i386/i386.c (ix86_expand_branch): Optimize LE/LEU/GT/GTU
+ DImode comparisons against constant with all 1's in the lower word.
+
2007-12-14 Uros Bizjak <ubizjak@gmail.com>
* config/i386/sse.md (sse4_2_pcmpestr): Use reg_not_xmm0_operand
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index fcae077..95a3496 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -12093,16 +12093,28 @@ ix86_expand_branch (enum rtx_code code, rtx label)
/* Otherwise, if we are doing less-than or greater-or-equal-than,
op1 is a constant and the low word is zero, then we can just
- examine the high word. */
+ examine the high word. Similarly for low word -1 and
+ less-or-equal-than or greater-than. */
- if (CONST_INT_P (hi[1]) && lo[1] == const0_rtx)
+ if (CONST_INT_P (hi[1]))
switch (code)
{
case LT: case LTU: case GE: case GEU:
- ix86_compare_op0 = hi[0];
- ix86_compare_op1 = hi[1];
- ix86_expand_branch (code, label);
- return;
+ if (lo[1] == const0_rtx)
+ {
+ ix86_compare_op0 = hi[0];
+ ix86_compare_op1 = hi[1];
+ ix86_expand_branch (code, label);
+ return;
+ }
+ case LE: case LEU: case GT: case GTU:
+ if (lo[1] == constm1_rtx)
+ {
+ ix86_compare_op0 = hi[0];
+ ix86_compare_op1 = hi[1];
+ ix86_expand_branch (code, label);
+ return;
+ }
default:
break;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c6ce8eb..89c0228 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-12-14 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/29978
+ * gcc.target/i386/pr29978.c: New test.
+
2007-12-14 Uros Bizjak <ubizjak@gmail.com>
* gcc.target/i386/sse-12.c (dg-options): Use -msse4
diff --git a/gcc/testsuite/gcc.target/i386/pr29978.c b/gcc/testsuite/gcc.target/i386/pr29978.c
new file mode 100644
index 0000000..8c0bf9f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr29978.c
@@ -0,0 +1,16 @@
+/* PR target/29978 */
+/* { dg-do compile } */
+/* { dg-options "-Os" } */
+
+void g ();
+
+void
+f (long long v)
+{
+ if (v > 0xfffffffffLL)
+ g ();
+ g ();
+}
+
+/* Verify there are no redundant jumps jl .L2; jle .L2 */
+/* { dg-final { scan-assembler-not "jl\[^e\]*\\.L" { target ilp32 } } } */