On Wed, 14 Jan 2015, Richard Biener wrote:
On Wed, Jan 14, 2015 at 1:45 PM, Marc Glisse <marc.gli...@inria.fr> wrote:
On Tue, 13 Jan 2015, Rasmus Villemoes wrote:
diff --git gcc/match.pd gcc/match.pd
index 81c4ee6..04a0bc4 100644
--- gcc/match.pd
+++ gcc/match.pd
@@ -262,6 +262,16 @@ along with GCC; see the file COPYING3. If not see
(abs tree_expr_nonnegative_p@0)
@0)
+/* x + (x & 1) -> (x + 1) & ~1 */
+(simplify
+ (plus @0 (bit_and @0 integer_onep@1))
+ (bit_and (plus @0 @1) (bit_not @1)))
+
+/* x | ~(x | y) -> x | ~y */
+(simplify
+ (bit_ior @0 (bit_not (bit_ior @0 @1)))
+ (bit_ior @0 (bit_not @1)))
You may want to consider using has_single_use (see other patterns).
Just to clarify, you mean on the (x | y) sub-expression?
I meant on (x & 1) for the first pattern and on ~(x | y) for the second
one. That is, cases where the transformation could actually increase the
number of statements (we don't have a convenient interface to check if
(x+1) or ~y are already available).
(x | y) could sometimes be cheaper than y if it is already computed and it
shortens the lifetime of y, but we are way too early in the pipeline to
make an informed decision about that, so it seems better to canonicalize.
Now that I think about it, some platforms probably have an instruction
ornot, so my reasons above could be wrong...
--
Marc Glisse