Roger Sayle - [Committed] Optimize "popcount(x) eq/ne 0" as "x eq/ne 0" (original) (raw)
This is the mail archive of the gcc-patches@gcc.gnu.orgmailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
- From: "Roger Sayle"
- To: gcc-patches at gcc dot gnu dot org
- Date: Sun, 11 Feb 2007 18:45:23 -0700 (MST)
- Subject: [Committed] Optimize "popcount(x) eq/ne 0" as "x eq/ne 0"
Some of the new AMDFAM10 patterns recently added to i386.md by Harsha contained the interesting RTL:
(set (reg FLAGS_REG) (compare (popcount:SI (match_operand:SI 1 "nonimmediate_operand" "rm")) (const_int 0)))
What's most interesting about this to the RTL optimizers, is that with a little thought it should be possible to simplify or optimize away all comparisons of __builtin_popcount against zero as follows:
(eq (popcount x) 0) -> (eq x 0) (ne (popcount x) 0) -> (ne x 0) (lt (popcount x) 0) -> false (ltu (popcount x) 0) -> false (le (popcount x) 0) -> (eq x 0) (leu (popcount x) 0) -> (eq x 0) (gt (popcount x) 0) -> (ne x 0) (gtu (popcount x) 0) -> (ne x 0) (ge (popcount x) 0) -> true (geu (popcount x) 0) -> true
The following patch implements the transformations above not already performed by the compiler.
The following patch has been tested on both i686-pc-linux-gnu and ia64-unknown-linux-gnu with a full "make bootstrap", all default languages (including Ada on IA-32), and regression tested with a top-level "make -k check" with no new failures. The new testcases confirm that we emit the Itanium's "popcnt" instruction for __builtin_popcount, but that we can optimize it away when used as "__builtin_popcount(x) == 0".
Committed to mainline as revision 121838.
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.
* gcc.target/ia64/builtin-popcount-1.c: New test case.
* gcc.target/ia64/builtin-popcount-2.c: Likewise.
Roger
Attachment:patchp.txt
Description: Text document
Attachment:builtin-popcount-1.c
Description: Text document
Attachment:builtin-popcount-2.c
Description: Text document
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |