Use conditional internal functions in if-conversion
authorRichard Sandiford <richard.sandiford@linaro.org>
Thu, 12 Jul 2018 13:02:00 +0000 (13:02 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 12 Jul 2018 13:02:00 +0000 (13:02 +0000)
commit2c58d42c3ed599b4c2976fc173eefd8e016ea216
tree1e031aeefba8cc358f1917d8f4088473cf5a38d7
parent0936858f081b77319f8f6e5825dc86d2861d0445
Use conditional internal functions in if-conversion

This patch uses IFN_COND_* to vectorise conditionally-executed,
potentially-trapping arithmetic, such as most floating-point
ops with -ftrapping-math.  E.g.:

    if (cond) { ... x = a + b; ... }

becomes:

    ...
    x = .COND_ADD (cond, a, b, else_value);
    ...

When this transformation is done on its own, the value of x for
!cond isn't important, so else_value is simply the target's
preferred_else_value (i.e. the value it can handle the most
efficiently).

However, the patch also looks for the equivalent of:

    y = cond ? x : c;

in which the "then" value is the result of the conditionally-executed
operation and the "else" value "c" is some value that is available at x.
In that case we can instead use:

    x = .COND_ADD (cond, a, b, c);

and replace uses of y with uses of x.

The patch also looks for:

    y = !cond ? c : x;

which can be transformed in the same way.  This involved adding a new
utility function inverse_conditions_p, which was already open-coded
in a more limited way in match.pd.

2018-07-12  Richard Sandiford  <richard.sandiford@linaro.org>

gcc/
* fold-const.h (inverse_conditions_p): Declare.
* fold-const.c (inverse_conditions_p): New function.
* match.pd: Use inverse_conditions_p.  Add folds of view_converts
that test the inverse condition of a conditional internal function.
* internal-fn.h (vectorized_internal_fn_supported_p): Declare.
* internal-fn.c (internal_fn_mask_index): Handle conditional
internal functions.
(vectorized_internal_fn_supported_p): New function.
* tree-if-conv.c: Include internal-fn.h and fold-const.h.
(any_pred_load_store): Replace with...
(need_to_predicate): ...this new variable.
(redundant_ssa_names): New variable.
(ifcvt_can_use_mask_load_store): Move initial checks to...
(ifcvt_can_predicate): ...this new function.  Handle tree codes
for which a conditional internal function exists.
(if_convertible_gimple_assign_stmt_p): Use ifcvt_can_predicate
instead of ifcvt_can_use_mask_load_store.  Update after variable
name change.
(predicate_load_or_store): New function, split out from
predicate_mem_writes.
(check_redundant_cond_expr): New function.
(value_available_p): Likewise.
(predicate_rhs_code): Likewise.
(predicate_mem_writes): Rename to...
(predicate_statements): ...this.  Use predicate_load_or_store
and predicate_rhs_code.
(combine_blocks, tree_if_conversion): Update after above name changes.
(ifcvt_local_dce): Handle redundant_ssa_names.
* tree-vect-patterns.c (vect_recog_mask_conversion_pattern): Handle
general conditional functions.
* tree-vect-stmts.c (vectorizable_call): Likewise.

gcc/testsuite/
* gcc.dg/vect/vect-cond-arith-4.c: New test.
* gcc.dg/vect/vect-cond-arith-5.c: Likewise.
* gcc.target/aarch64/sve/cond_arith_1.c: Likewise.
* gcc.target/aarch64/sve/cond_arith_1_run.c: Likewise.
* gcc.target/aarch64/sve/cond_arith_2.c: Likewise.
* gcc.target/aarch64/sve/cond_arith_2_run.c: Likewise.
* gcc.target/aarch64/sve/cond_arith_3.c: Likewise.
* gcc.target/aarch64/sve/cond_arith_3_run.c: Likewise.

From-SVN: r262589
18 files changed:
gcc/ChangeLog
gcc/fold-const.c
gcc/fold-const.h
gcc/internal-fn.c
gcc/internal-fn.h
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/vect-cond-arith-4.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/vect-cond-arith-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/cond_arith_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/cond_arith_1_run.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/cond_arith_2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/cond_arith_2_run.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/cond_arith_3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/cond_arith_3_run.c [new file with mode: 0644]
gcc/tree-if-conv.c
gcc/tree-vect-patterns.c
gcc/tree-vect-stmts.c