On Thu, 27 Nov 2025, Tamar Christina wrote:

> Hi All,
> 
> This checks if the arguments of the boolean operation
> are an SSA_NAME before we try to lookup their definition.
> 
> Bootstrapped Regtested on aarch64-none-linux-gnu,
> arm-none-linux-gnueabihf, x86_64-pc-linux-gnu
> -m32, -m64 and on-going issues.
> 
> Ok for master if no regressions?

OK.

> Thanks,
> Tamar
> 
> gcc/ChangeLog:
> 
>       PR middle-end/122890
>       * optabs.cc (emit_cmp_and_jump_insns): Check for SSA Name.
> 
> gcc/testsuite/ChangeLog:
> 
>       PR middle-end/122890
>       * g++.target/aarch64/pr122890.C: New test.
> 
> ---
> diff --git a/gcc/optabs.cc b/gcc/optabs.cc
> index 
> 0f1495545a496e9045f1a9d35b3b1385a80bc558..183ad910fcd7c579cead076afe0e6bc069d25d5e
>  100644
> --- a/gcc/optabs.cc
> +++ b/gcc/optabs.cc
> @@ -4854,13 +4854,15 @@ emit_cmp_and_jump_insns (rtx x, rtx y, enum rtx_code 
> comparison, rtx size,
>             gimple *mask_def = NULL;
>             tree rhs1 = gimple_assign_rhs1 (def_stmt);
>             tree rhs2 = gimple_assign_rhs2 (def_stmt);
> -           if ((mask_def = get_gimple_for_ssa_name (rhs1))
> +           if (TREE_CODE (rhs1) == SSA_NAME
> +               && (mask_def = get_gimple_for_ssa_name (rhs1))
>                 && is_gimple_assign (mask_def)
>                 && TREE_CODE_CLASS (gimple_assign_rhs_code (mask_def)))
>               masked_op = rhs2;
> -           else if ((mask_def = get_gimple_for_ssa_name (rhs2))
> -               && is_gimple_assign (mask_def)
> -               && TREE_CODE_CLASS (gimple_assign_rhs_code (mask_def)))
> +           else if (TREE_CODE (rhs2) == SSA_NAME
> +                    && (mask_def = get_gimple_for_ssa_name (rhs2))
> +                    && is_gimple_assign (mask_def)
> +                    && TREE_CODE_CLASS (gimple_assign_rhs_code (mask_def)))
>               masked_op = rhs1;
>  
>             if (masked_op)
> @@ -4890,7 +4892,8 @@ emit_cmp_and_jump_insns (rtx x, rtx y, enum rtx_code 
> comparison, rtx size,
>                 len_bias = gimple_call_arg (call, 4);
>                 tree arg0 = gimple_call_arg (call, 0);
>  
> -               def_stmt = get_gimple_for_ssa_name (arg0);
> +               if (TREE_CODE (arg0) == SSA_NAME)
> +                 def_stmt = get_gimple_for_ssa_name (arg0);
>               }
>           }
>  
> diff --git a/gcc/testsuite/g++.target/aarch64/pr122890.C 
> b/gcc/testsuite/g++.target/aarch64/pr122890.C
> new file mode 100644
> index 
> 0000000000000000000000000000000000000000..2b7426486d42fdf8d7008165d1a1ff5364547079
> --- /dev/null
> +++ b/gcc/testsuite/g++.target/aarch64/pr122890.C
> @@ -0,0 +1,16 @@
> +/* { dg-do compile } */
> +/* { dg-options "-march=armv8-a -std=c++11 -Ofast" } */
> +
> +#include <vector>
> +
> +int foo()
> +{
> +     bool xs[] = { true, true, false, true };
> +     bool s[] = { true, true, false };
> +     std::vector<bool> x(xs, xs+4);
> +     std::vector<bool> g(s, s+3);
> +     g.push_back(true);
> +      if (g != x)
> +      __builtin_abort();
> +     return 0;
> +}
> 
> 
> 

-- 
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Jochen Jaser, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to