(extremely minor comments, not directly related to the machinery)
On Fri, 7 Mar 2014, Richard Biener wrote:
+ /* fold_negate_exprs convert - (~A) to A + 1. */ + (match_and_simplify + (negate (bit_not @0)) + if (INTEGRAL_TYPE_P (TREE_TYPE (@0))) + (plus @0 { build_int_cst (TREE_TYPE (@0), 1); } ))
We are obviously not at the stage of reviewing individual patterns, but it would be nice to keep in mind, while doing this, that a lot of those transformations (most of them?) should apply just the same to vectors. So it should be easy to test: the type is integral or a vector of integers (and maybe complex as well, with the subtlety that sometimes the constant 1 should be 1+0i, but for this transformation it should be 1+i), something is either the constant 2 or a vector of 2, etc, and build a constant.
+ /* (x >> 31) & 1 -> (x >> 31). Folding in fold-const is more + complicated here, it does + Fold (X << C1) & C2 into (X << C1) & (C2 | ((1 << C1) - 1)) + (X >> C1) & C2 into (X >> C1) & (C2 | ~((type) -1 >> C1)) + if the new mask might be further optimized. */ + (match_and_simplify + (bit_and (rshift@0 @1 INTEGER_CST_P@2) integer_onep) + if (compare_tree_int (@2, TYPE_PRECISION (TREE_TYPE (@1)) - 1) == 0) + @0)
s/TYPE_PRECISION/element_precision/ will make it easier to port to vectors. I think this transformation shouldn't output x>>31 but (unsigned)x>>31, that would give an example of how to convert in this language. -- Marc Glisse