This pattern is currently: `((VCE (a cmp b ? -1 : 0)) < 0) ? c : d`
But the inner comparison does not matter for VEC_COND so let's remove
it to reduce generated code from genmatch. It might also optimize
things that used `a & b` rather than a comparison. Though in the
original case does not matter. Note this pattern can be
simplified more but I am not handling that right now.
Bootstrapped and tested on x86_64-linux-gnu.
gcc/ChangeLog:
* match.pd (`((VCE (a cmp b ? -1 : 0)) < 0) ? c : d`): Remove
`(a cmp b)` match part.
Signed-off-by: Andrea Pinski <[email protected]>
---
gcc/match.pd | 36 ++++++++++++++++--------------------
1 file changed, 16 insertions(+), 20 deletions(-)
diff --git a/gcc/match.pd b/gcc/match.pd
index 0e96727083f..341962a3faa 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -6850,27 +6850,23 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(if (optimize_vectors_before_lowering_p () && types_match (@0, @3))
(vec_cond (bit_and @0 (bit_not @3)) @2 @1)))
-/* ((VCE (a cmp b ? -1 : 0)) < 0) ? c : d is just
- (VCE ((a cmp b) ? (VCE c) : (VCE d))) when TYPE_PRECISION of the
+/* ((VCE (a ? -1 : 0)) < 0) ? c : d is just
+ (VCE (a ? (VCE c) : (VCE d))) when TYPE_PRECISION of the
component type of the outer vec_cond is greater equal the inner one. */
-(for cmp (simple_comparison)
- (simplify
- (vec_cond
- (lt (view_convert@5 (vec_cond@6 (cmp@4 @0 @1)
- integer_all_onesp
- integer_zerop))
- integer_zerop) @2 @3)
- (if (VECTOR_INTEGER_TYPE_P (TREE_TYPE (@0))
- && VECTOR_INTEGER_TYPE_P (TREE_TYPE (@5))
- && !TYPE_UNSIGNED (TREE_TYPE (@5))
- && VECTOR_TYPE_P (TREE_TYPE (@6))
- && VECTOR_TYPE_P (type)
- && tree_int_cst_le (TYPE_SIZE (TREE_TYPE (type)),
- TYPE_SIZE (TREE_TYPE (TREE_TYPE (@6))))
- && TYPE_SIZE (type) == TYPE_SIZE (TREE_TYPE (@6)))
- (with { tree vtype = TREE_TYPE (@6);}
- (view_convert:type
- (vec_cond @4 (view_convert:vtype @2) (view_convert:vtype @3)))))))
+(simplify
+ (vec_cond
+ (lt (view_convert@5 (vec_cond@6 @4 integer_all_onesp integer_zerop))
+ integer_zerop) @2 @3)
+ (if (VECTOR_INTEGER_TYPE_P (TREE_TYPE (@5))
+ && !TYPE_UNSIGNED (TREE_TYPE (@5))
+ && VECTOR_TYPE_P (TREE_TYPE (@6))
+ && VECTOR_TYPE_P (type)
+ && tree_int_cst_le (TYPE_SIZE (TREE_TYPE (type)),
+ TYPE_SIZE (TREE_TYPE (TREE_TYPE (@6))))
+ && TYPE_SIZE (type) == TYPE_SIZE (TREE_TYPE (@6)))
+ (with { tree vtype = TREE_TYPE (@6);}
+ (view_convert:type
+ (vec_cond @4 (view_convert:vtype @2) (view_convert:vtype @3))))))
/* c1 ? c2 ? a : b : b --> (c1 & c2) ? a : b */
(simplify
--
2.43.0