On Thu, 7 May 2026, Tamar Christina wrote:
> This patch is a NFC, but while working on the second patch I noticed that when
> folding an expression in a gassign in SCEV we check whether it's a unary or
> binary operation and then individually analyze the components and then fold
> the
> results using the original operator.
>
> SCEV however can already handle expressions recursively in instantiate_scev_r,
> so this is replicating some code.
>
> Instead convert the gimple to a tree expression with gimple_assign_rhs_to_tree
> and pass that to instantiate_scev_r.
>
> I will note that gimple_assign_rhs_to_tree also handle ternary expressions.
>
> Bootstrapped Regtested on aarch64-none-linux-gnu,
> arm-none-linux-gnueabihf, x86_64-pc-linux-gnu
> -m32, -m64 and no issues.
>
> Ok for master?
Nope. gimple_assign_rhs_to_tree shouldn't be used, it's going to waste
GC memory here.
Sure, this results in "redundant" handling of both GIMPLE and
GENERIC, but so be it ...
> Thanks,
> Tamar
>
> gcc/ChangeLog:
>
> * tree-scalar-evolution.cc (instantiate_scev_name): Use
> gimple_assign_rhs_to_tree.
>
> ---
> diff --git a/gcc/tree-scalar-evolution.cc b/gcc/tree-scalar-evolution.cc
> index
> f524786f33be6ae46f04c68c796610a8ecfafede..710a40921acf15b3dd1b130629c38083e551c2be
> 100644
> --- a/gcc/tree-scalar-evolution.cc
> +++ b/gcc/tree-scalar-evolution.cc
> @@ -281,6 +281,7 @@ along with GCC; see the file COPYING3. If not see
> #include "dumpfile.h"
> #include "tree-ssa-propagate.h"
> #include "gimple-fold.h"
> +#include "cfgexpand.h"
> #include "tree-into-ssa.h"
> #include "builtins.h"
> #include "case-cfn-macros.h"
> @@ -2385,40 +2386,9 @@ instantiate_scev_name (edge instantiate_below,
> {
> gimple *def = SSA_NAME_DEF_STMT (chrec);
> if (gassign *ass = dyn_cast <gassign *> (def))
> - {
> - switch (gimple_assign_rhs_class (ass))
> - {
> - case GIMPLE_UNARY_RHS:
> - {
> - tree op0 = instantiate_scev_r (instantiate_below,
> evolution_loop,
> - inner_loop, gimple_assign_rhs1
> (ass),
> - fold_conversions, size_expr);
> - if (op0 == chrec_dont_know)
> - return chrec_dont_know;
> - res = fold_build1 (gimple_assign_rhs_code (ass),
> - TREE_TYPE (chrec), op0);
> - break;
> - }
> - case GIMPLE_BINARY_RHS:
> - {
> - tree op0 = instantiate_scev_r (instantiate_below,
> evolution_loop,
> - inner_loop, gimple_assign_rhs1
> (ass),
> - fold_conversions, size_expr);
> - if (op0 == chrec_dont_know)
> - return chrec_dont_know;
> - tree op1 = instantiate_scev_r (instantiate_below,
> evolution_loop,
> - inner_loop, gimple_assign_rhs2
> (ass),
> - fold_conversions, size_expr);
> - if (op1 == chrec_dont_know)
> - return chrec_dont_know;
> - res = fold_build2 (gimple_assign_rhs_code (ass),
> - TREE_TYPE (chrec), op0, op1);
> - break;
> - }
> - default:
> - res = chrec_dont_know;
> - }
> - }
> + res = instantiate_scev_r (instantiate_below, evolution_loop,
> + inner_loop, gimple_assign_rhs_to_tree (ass),
> + fold_conversions, size_expr);
> else
> res = chrec_dont_know;
> global_cache->set (si, res);
>
>
>
--
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)