[v3,3/8] tree-ifcvt: Add zero maskload else value.
Checks
Context |
Check |
Description |
linaro-tcwg-bot/tcwg_gcc_build--master-arm |
fail
|
Build failed
|
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 |
fail
|
Build failed
|
Commit Message
From: Robin Dapp <rdapp@ventanamicro.com>
When predicating a load we implicitly assume that the else value is
zero. This matters in case the loaded value is padded (like e.g.
a Bool) and we must ensure that the padding bytes are zero on targets
that don't implicitly zero inactive elements.
A former version of this patch still had this handling in ifcvt but
the latest version defers it to the vectorizer.
gcc/ChangeLog:
* tree-if-conv.cc (predicate_load_or_store): Add zero else
operand and comment.
---
gcc/tree-if-conv.cc | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
Comments
On Sat, 2 Nov 2024, Robin Dapp wrote:
> From: Robin Dapp <rdapp@ventanamicro.com>
>
> When predicating a load we implicitly assume that the else value is
> zero. This matters in case the loaded value is padded (like e.g.
> a Bool) and we must ensure that the padding bytes are zero on targets
> that don't implicitly zero inactive elements.
>
> A former version of this patch still had this handling in ifcvt but
> the latest version defers it to the vectorizer.
This version is OK.
Thanks,
Richard.
> gcc/ChangeLog:
>
> * tree-if-conv.cc (predicate_load_or_store): Add zero else
> operand and comment.
> ---
> gcc/tree-if-conv.cc | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/gcc/tree-if-conv.cc b/gcc/tree-if-conv.cc
> index eb981642bae..f1a1f8fd0d3 100644
> --- a/gcc/tree-if-conv.cc
> +++ b/gcc/tree-if-conv.cc
> @@ -2555,9 +2555,17 @@ predicate_load_or_store (gimple_stmt_iterator *gsi, gassign *stmt, tree mask)
> ref);
> if (TREE_CODE (lhs) == SSA_NAME)
> {
> + /* Get a zero else value. This might not be what a target actually uses
> + but we cannot be sure about which vector mode the vectorizer will
> + choose. Therefore, leave the decision whether we need to force the
> + inactive elements to zero to the vectorizer. */
> + tree els = vect_get_mask_load_else (MASK_LOAD_ELSE_ZERO,
> + TREE_TYPE (lhs));
> +
> new_stmt
> - = gimple_build_call_internal (IFN_MASK_LOAD, 3, addr,
> - ptr, mask);
> + = gimple_build_call_internal (IFN_MASK_LOAD, 4, addr,
> + ptr, mask, els);
> +
> gimple_call_set_lhs (new_stmt, lhs);
> gimple_set_vuse (new_stmt, gimple_vuse (stmt));
> }
>
@@ -2555,9 +2555,17 @@ predicate_load_or_store (gimple_stmt_iterator *gsi, gassign *stmt, tree mask)
ref);
if (TREE_CODE (lhs) == SSA_NAME)
{
+ /* Get a zero else value. This might not be what a target actually uses
+ but we cannot be sure about which vector mode the vectorizer will
+ choose. Therefore, leave the decision whether we need to force the
+ inactive elements to zero to the vectorizer. */
+ tree els = vect_get_mask_load_else (MASK_LOAD_ELSE_ZERO,
+ TREE_TYPE (lhs));
+
new_stmt
- = gimple_build_call_internal (IFN_MASK_LOAD, 3, addr,
- ptr, mask);
+ = gimple_build_call_internal (IFN_MASK_LOAD, 4, addr,
+ ptr, mask, els);
+
gimple_call_set_lhs (new_stmt, lhs);
gimple_set_vuse (new_stmt, gimple_vuse (stmt));
}