[v3,3/8] tree-ifcvt: Add zero maskload else value.

Message ID 20241102125828.29183-4-rdapp.gcc@gmail.com
State Committed
Commit 6b6bd53619fd11bab3def8dee737711a7ee539ea
Headers
Series Rebased: Add maskload else operand. |

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

Robin Dapp Nov. 2, 2024, 12:58 p.m. UTC
  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

Richard Biener Nov. 4, 2024, 1:49 p.m. UTC | #1
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));
>      }
>
  

Patch

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));
     }