On Mon, 27 Nov 2023, Tamar Christina wrote:

> Hi All,
> 
> LIM notices that in some cases the condition and the results are loop
> invariant and tries to move them out of the loop.
> 
> While the resulting code is operationally sound, moving the compare out of the
> gcond results in generating code that no longer branches, so cbranch is no
> longer applicable.  As such I now add code to check during this motion to see
> if the target supports flag setting vector comparison as general operation.
> 
> I have tried writing a GIMPLE testcase for this but the gimple FE seems to be
> having some trouble with the vector types.  It seems to fail parsing.
> 
> The early break code testsuite however has a test for this
> (vect-early-break_67.c).
> 
> Bootstrapped Regtested on aarch64-none-linux-gnu and no issues.
> 
> Ok for master?

OK.

Thanks,
Richard.

> Thanks,
> Tamar
> 
> gcc/ChangeLog:
> 
>       * tree-ssa-loop-im.cc (determine_max_movement): Import insn-codes.h
>       and optabs-tree.h and check for vector compare motion out of gcond.
> 
> --- inline copy of patch -- 
> diff --git a/gcc/tree-ssa-loop-im.cc b/gcc/tree-ssa-loop-im.cc
> index 
> 396963b6754c7671e2e5404302a69129918555e2..2ebf6d6548c4858fd5a8b4f9ab6f332f3fe8f6cd
>  100644
> --- a/gcc/tree-ssa-loop-im.cc
> +++ b/gcc/tree-ssa-loop-im.cc
> @@ -48,6 +48,8 @@ along with GCC; see the file COPYING3.  If not see
>  #include "tree-dfa.h"
>  #include "tree-ssa.h"
>  #include "dbgcnt.h"
> +#include "insn-codes.h"
> +#include "optabs-tree.h"
>  
>  /* TODO:  Support for predicated code motion.  I.e.
>  
> @@ -852,6 +854,17 @@ determine_max_movement (gimple *stmt, bool 
> must_preserve_exec)
>         if (!extract_true_false_args_from_phi (dom, phi, NULL, NULL))
>           return false;
>  
> +     /* Check if one of the depedent statement is a vector compare whether
> +        the target supports it,  otherwise it's invalid to hoist it out of
> +        the gcond it belonged to.  */
> +     if (VECTOR_TYPE_P (TREE_TYPE (gimple_cond_lhs (cond))))
> +       {
> +         tree type = TREE_TYPE (gimple_cond_lhs (cond));
> +         auto code = gimple_cond_code (cond);
> +         if (!target_supports_op_p (type, code, optab_vector))
> +           return false;
> +       }
> +
>         /* Fold in dependencies and cost of the condition.  */
>         FOR_EACH_SSA_TREE_OPERAND (val, cond, iter, SSA_OP_USE)
>           {
> 
> 
> 
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to