summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>2007-02-12 01:43:50 +0000
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>2007-02-12 01:43:50 +0000
commitecf8b614f9c9d6854b2f028143db8946e55c38e7 (patch)
tree0f422267ae47a4e1db8030365f255263615dd2c6
parenta1f69845266b2b7417bca8606ed0d9e402a0f915 (diff)
downloadppe42-gcc-ecf8b614f9c9d6854b2f028143db8946e55c38e7.tar.gz
ppe42-gcc-ecf8b614f9c9d6854b2f028143db8946e55c38e7.zip
* simplify-rtx.c (simplify_relational_operation_1): Optimize
comparisons of POPCOUNT against zero. (simplify_const_relational_operation): Likewise. * gcc.target/ia64/builtin-popcount-1.c: New test case. * gcc.target/ia64/builtin-popcount-2.c: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@121838 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/simplify-rtx.c29
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/ia64/builtin-popcount-1.c9
-rw-r--r--gcc/testsuite/gcc.target/ia64/builtin-popcount-2.c9
5 files changed, 58 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 73feadee38b..a5f9960a1ae 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2007-02-11 Roger Sayle <roger@eyesopen.com>
+
+ * simplify-rtx.c (simplify_relational_operation_1): Optimize
+ comparisons of POPCOUNT against zero.
+ (simplify_const_relational_operation): Likewise.
+
2007-02-11 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
* doc/invoke.texi (Wextra): Delete outdated paragraph.
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index 8d8bbe52d0c..6f7c37d4c56 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -3802,6 +3802,27 @@ simplify_relational_operation_1 (enum rtx_code code, enum machine_mode mode,
simplify_gen_binary (XOR, cmp_mode,
XEXP (op0, 1), op1));
+ if (op0code == POPCOUNT && op1 == const0_rtx)
+ switch (code)
+ {
+ case EQ:
+ case LE:
+ case LEU:
+ /* (eq (popcount x) (const_int 0)) -> (eq x (const_int 0)). */
+ return simplify_gen_relational (EQ, mode, GET_MODE (XEXP (op0, 0)),
+ XEXP (op0, 0), const0_rtx);
+
+ case NE:
+ case GT:
+ case GTU:
+ /* (ne (popcount x) (const_int 0)) -> (ne x (const_int 0)). */
+ return simplify_gen_relational (EQ, mode, GET_MODE (XEXP (op0, 0)),
+ XEXP (op0, 0), const0_rtx);
+
+ default:
+ break;
+ }
+
return NULL_RTX;
}
@@ -4067,6 +4088,10 @@ simplify_const_relational_operation (enum rtx_code code,
if (GET_CODE (tem) == ABS)
return const0_rtx;
}
+
+ /* Optimize popcount (x) < 0. */
+ if (GET_CODE (trueop0) == POPCOUNT && trueop1 == const0_rtx)
+ return const_true_rtx;
break;
case GE:
@@ -4081,6 +4106,10 @@ simplify_const_relational_operation (enum rtx_code code,
if (GET_CODE (tem) == ABS)
return const_true_rtx;
}
+
+ /* Optimize popcount (x) >= 0. */
+ if (GET_CODE (trueop0) == POPCOUNT && trueop1 == const0_rtx)
+ return const_true_rtx;
break;
case UNGE:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b6a6c0a8832..92670f42758 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-02-11 Roger Sayle <roger@eyesopen.com>
+
+ * gcc.target/ia64/builtin-popcount-1.c: New test case.
+ * gcc.target/ia64/builtin-popcount-2.c: Likewise.
+
2007-02-11 Tobias Schlüter <tobi@gcc.gnu.org>
PR fortran/30478
diff --git a/gcc/testsuite/gcc.target/ia64/builtin-popcount-1.c b/gcc/testsuite/gcc.target/ia64/builtin-popcount-1.c
new file mode 100644
index 00000000000..c9641d0e6df
--- /dev/null
+++ b/gcc/testsuite/gcc.target/ia64/builtin-popcount-1.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler "popcnt" } } */
+
+int foo (int x)
+{
+ return __builtin_popcount (x);
+}
+
diff --git a/gcc/testsuite/gcc.target/ia64/builtin-popcount-2.c b/gcc/testsuite/gcc.target/ia64/builtin-popcount-2.c
new file mode 100644
index 00000000000..50ced72e728
--- /dev/null
+++ b/gcc/testsuite/gcc.target/ia64/builtin-popcount-2.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler-not "popcnt" } } */
+
+int foo (int x)
+{
+ return __builtin_popcount (x) == 0;
+}
+
OpenPOWER on IntegriCloud