if the target can do it in one go. This makes the operation conditional
on c, so could drop potentially-trapping arithmetic, but that's a valid
simplification if the result of the operation isn't needed. */
+#if GIMPLE
(for uncond_op (UNCOND_BINARY)
cond_op (COND_BINARY)
(simplify
(vec_cond @0 (view_convert? (uncond_op@4 @1 @2)) @3)
- (with { tree op_type = TREE_TYPE (@4); }
- (if (element_precision (type) == element_precision (op_type))
+ (with { tree op_type = TREE_TYPE (@4);
+ internal_fn cond_fn = get_conditional_internal_fn (uncond_op); }
+ (if (cond_fn != IFN_LAST
+ && vectorized_internal_fn_supported_p (cond_fn, op_type)
+ && element_precision (type) == element_precision (op_type))
(view_convert (cond_op @0 @1 @2 (view_convert:op_type @3))))))
(simplify
(vec_cond @0 @1 (view_convert? (uncond_op@4 @2 @3)))
- (with { tree op_type = TREE_TYPE (@4); }
- (if (element_precision (type) == element_precision (op_type))
+ (with { tree op_type = TREE_TYPE (@4);
+ internal_fn cond_fn = get_conditional_internal_fn (uncond_op); }
+ (if (cond_fn != IFN_LAST
+ && vectorized_internal_fn_supported_p (cond_fn, op_type)
+ && element_precision (type) == element_precision (op_type))
(view_convert (cond_op (bit_not @0) @2 @3 (view_convert:op_type @1)))))))
/* Same for ternary operations. */
cond_op (COND_TERNARY)
(simplify
(vec_cond @0 (view_convert? (uncond_op@5 @1 @2 @3)) @4)
- (with { tree op_type = TREE_TYPE (@5); }
- (if (element_precision (type) == element_precision (op_type))
+ (with { tree op_type = TREE_TYPE (@5);
+ internal_fn cond_fn
+ = get_conditional_internal_fn (as_internal_fn (uncond_op)); }
+ (if (cond_fn != IFN_LAST
+ && vectorized_internal_fn_supported_p (cond_fn, op_type)
+ && element_precision (type) == element_precision (op_type))
(view_convert (cond_op @0 @1 @2 @3 (view_convert:op_type @4))))))
(simplify
(vec_cond @0 @1 (view_convert? (uncond_op@5 @2 @3 @4)))
- (with { tree op_type = TREE_TYPE (@5); }
- (if (element_precision (type) == element_precision (op_type))
+ (with { tree op_type = TREE_TYPE (@5);
+ internal_fn cond_fn
+ = get_conditional_internal_fn (as_internal_fn (uncond_op)); }
+ (if (cond_fn != IFN_LAST
+ && vectorized_internal_fn_supported_p (cond_fn, op_type)
+ && element_precision (type) == element_precision (op_type))
(view_convert (cond_op (bit_not @0) @2 @3 @4
(view_convert:op_type @1)))))))
+#endif
/* Detect cases in which a VEC_COND_EXPR effectively replaces the
"else" value of an IFN_COND_*. */