diff options
author | Roger Sayle <roger@eyesopen.com> | 2007-02-12 01:43:50 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2007-02-12 01:43:50 +0000 |
commit | 69fce32ff9c8ef7bcc4557253798979118d96b43 (patch) | |
tree | 0f422267ae47a4e1db8030365f255263615dd2c6 /gcc/simplify-rtx.c | |
parent | cf24243ee0d939b7685d19768f4640caa06b690f (diff) | |
download | gcc-69fce32ff9c8ef7bcc4557253798979118d96b43.zip gcc-69fce32ff9c8ef7bcc4557253798979118d96b43.tar.gz gcc-69fce32ff9c8ef7bcc4557253798979118d96b43.tar.bz2 |
simplify-rtx.c (simplify_relational_operation_1): Optimize comparisons of POPCOUNT against zero.
* 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.
From-SVN: r121838
Diffstat (limited to 'gcc/simplify-rtx.c')
-rw-r--r-- | gcc/simplify-rtx.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index 8d8bbe5..6f7c37d 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: |