On Tue, 28 Jul 2026, Tamar Christina wrote:
> > -----Original Message-----
> > From: Richard Biener <[email protected]>
> > Sent: 28 July 2026 08:46
> > To: Tamar Christina <[email protected]>
> > Cc: [email protected]; nd <[email protected]>
> > Subject: Re: [patch v2 2/3]middle-end: expand fold_stmt to take additional
> > simplifier
> >
> > On Thu, 16 Jul 2026, Tamar Christina wrote:
> >
> > > This extends folding to take an optional gimplifier (not a fan of the name
> > > but it's what it was called before) to use during folding.
> > >
> > > This allows you to specify which .pd file should be used during the fold.
> > >
> > > Bootstrapped Regtested on aarch64-none-linux-gnu,
> > > arm-none-linux-gnueabihf, x86_64-pc-linux-gnu
> > > -m32, -m64 and no issues.
> > >
> > > Ok for master?
> >
> > See 3/3. This also raises the question (again) how separate namespace
> > simplifiers integrate with the "main" simplifiers. As implemented
> > in 1/3 they do not know each others (but at least constant folding
> > is done via the resimplify wrapper). Does this mean we could end
> > up needing to iterate folding with both? Doesn't matter much
> > for ISEL instruction selection (but IIRC your ISEL patterns are
> > not that but "simplifiers"), but eventually for your idea of
> > doing target specific folding?
> >
> > Wouldn't that ask for a single matcher but patterns gated on
> > enabled flags?
>
> That's an alternative approach yeah. It has some pros:
>
> 1. The AST traversal can be shared
> 2. It doesn't require these changes
>
> But it has some real cons:
>
> 1. You have patterns that are always going to be disabled for some
> targets taking up space.
> 2. It increases compile times for all targets, since they can't be compiled
> out in order to maintain the semantics that some foldings are only
> available at certain times. Llike for instance I wouldn't want the
> AArch64
> isel ones available always.
With "all targets" you mean "all subtargets"? For sure we'll not
compile in aarch64.pd in a x86_64 target compiler. So is your plan
to have multiple aarch64 namespaces?
> Though I guess the target specific ones could be in a different .pd file and
> only conditionally included?
Well, sure! Like we have insn patterns for each target separately.
> My approach to do the above was to change the gimplifier type to
> a class and have the class apply simplifiers in order.
:/
> This of course won't share the AST traversals. But it does feel like the
> separate simplifier approach is growing a bit out of control.
>
> I asked you to wait to see what I had mind till I sent the patches and
> you have, so it's time I evaluate what you had in mind.
>
> With a pattern like this
>
> (for cond_op (COND_BINARY)
> (simplify
> (vec_cond @0
> (cond_op:s @1 @2 @3 @4) @4)
> (cond_op (bit_and @1 @0) @2 @3 @4)))
>
> (is_enabled isel
> (for cond_op (COND_BINARY)
> (simplify
> (vec_cond @0
> (cond_op:s @1 @2 @3 @4) @4)
> (cond_op (bit_and @1 @0) @2 @3 @4))))
>
> ?
Yeah, syntactically this would work. For config/*/*.pd I'd have
sth like
./build/genmatch ... --conditional <flag-name> config/<target>/<target>.pd
aka similar to -include <...>. We might go with -include as well
and wrap the whole target.pd inside a (enabled_if isel
Maybe also support
(enabled_if (isel aarch64)
to have logical OR. logical AND is
(enabled_if isel
(enabled_if aarch64
implementation-wise I'd perform the full pattern matching and have the
enabled_if checking done as the first conditional on actual matches,
with bitmask tests
if (enabled & (isel | aarch64))
if (enabled & ...)
I think that's good enough - I do not expect much "collisions"(?).
I'll note we have pre-existing enabled things in canonicalize_math_p,
canonicalize_math_after_vectorization_p, fold_before_rtl_expansion_p,
etc. though some of these are "late" conditionals. Meaning we might
not need a new syntax at all,
(if (single_use (@3)
&& pow2p_hwi (prec)
/* Defer this case until last forwprop, so that VRP could be run
and
expr_not_equal_to had a chance to match. Otherwise we'd do
pretty much always just the second case. */
&& cfun
&& (fold_before_rtl_expansion_p ()
|| !flag_tree_vrp
|| optimize_debug))
might become
&& (enable_if (fold_before_rtl_expansion_p)
and (enable_if isel would simply be
(if (enable_if (isel))
(simplify (...)
...)
where 'enable_if' would be an inline function and we'd have an
enum with all the bits.
The active enabled set would be just another global variable.
I'm for some time thinking of adding a match context like
we have a gimplify_ctx holding state (like the mprts_hook
and the valueizer(s)), possibly with similar ways to push/pop
the active context. But that's something separate (just use
a global var for enabled).
> So that we can quickly skip it during traversals?
So in the end I think everything is there already besides the
global flags variable and the enabled_if (..) inline function.
For the isel.pd part. For config/*/* we possibly miss some
genmatch command stuff to conditionally include a file (not
all targets might provide one) and either add a path or
include a full file.
Richard.
> Thanks,
> Tamar
>
> >
> > Thanks,
> > Richard.
> >
> > >
> > > Thanks,
> > > Tamar
> > >
> > > gcc/ChangeLog:
> > >
> > > * gimple-fold.cc (fold_stmt_1): Pass gimplifier along.
> > > (fold_stmt): New.
> > > (fold_stmt_inplace): Pass gimplifier along.
> > > (and_comparisons_1, and_var_with_comparison,
> > and_var_with_comparison_1,
> > > or_comparisons_1, or_var_with_comparison,
> > or_var_with_comparison_1,
> > > (maybe_fold_comparisons_from_match_pd): Likewise.
> > > (maybe_fold_or_comparisons): Likewise.
> > > (maybe_fold_and_comparisons): New.
> > > (gimple_fold_stmt_to_constant_1): New.
> > > * gimple-fold.h (fold_stmt_inplace, fold_stmt): New.
> > > (maybe_fold_and_comparisons, gimple_fold_stmt_to_constant_1):
> > New.
> > >
> > > ---
> > > diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
> > > index
> > d1da1f00f0fed7765c8785158a915cb9bb3c88c0..b642cd25c773b29076e07
> > 11b215d0b32d11ceef9 100644
> > > --- a/gcc/gimple-fold.cc
> > > +++ b/gcc/gimple-fold.cc
> > > @@ -6774,7 +6774,7 @@ maybe_canonicalize_mem_ref_addr (tree *t,
> > bool is_debug = false)
> > >
> > > static bool
> > > fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace, tree (*valueize)
> > > (tree),
> > > - bitmap dce_worklist = nullptr)
> > > + gimple_match_simplify_fn simplifier, bitmap dce_worklist = nullptr)
> > > {
> > > bool changed = false;
> > > gimple *stmt = gsi_stmt (*gsi);
> > > @@ -6937,7 +6937,7 @@ fold_stmt_1 (gimple_stmt_iterator *gsi, bool
> > inplace, tree (*valueize) (tree),
> > > {
> > > gimple_seq seq = NULL;
> > > gimple_match_op res_op;
> > > - res_op.set_simplifier (gimple_simplify);
> > > + res_op.set_simplifier (simplifier);
> > > if (gimple_simplify (stmt, &res_op, inplace ? NULL : &seq,
> > > valueize, valueize)
> > > && replace_stmt_with_simplification (gsi, &res_op, &seq, inplace,
> > > @@ -7094,13 +7094,28 @@ follow_all_ssa_edges (tree val)
> > > bool
> > > fold_stmt (gimple_stmt_iterator *gsi, bitmap dce_bitmap)
> > > {
> > > - return fold_stmt_1 (gsi, false, no_follow_ssa_edges, dce_bitmap);
> > > + return fold_stmt (gsi, gimple_simplify,dce_bitmap);
> > > }
> > >
> > > bool
> > > fold_stmt (gimple_stmt_iterator *gsi, tree (*valueize) (tree), bitmap
> > dce_bitmap)
> > > {
> > > - return fold_stmt_1 (gsi, false, valueize, dce_bitmap);
> > > + return fold_stmt (gsi, valueize, gimple_simplify, dce_bitmap);
> > > +}
> > > +
> > > +bool
> > > +fold_stmt (gimple_stmt_iterator *gsi, gimple_match_simplify_fn
> > > simplifier,
> > > + bitmap dce_bitmap)
> > > +{
> > > + return fold_stmt_1 (gsi, false, no_follow_ssa_edges, simplifier,
> > > + dce_bitmap);
> > > +}
> > > +
> > > +bool
> > > +fold_stmt (gimple_stmt_iterator *gsi, tree (*valueize) (tree),
> > > + gimple_match_simplify_fn simplifier, bitmap dce_bitmap)
> > > +{
> > > + return fold_stmt_1 (gsi, false, valueize, simplifier, dce_bitmap);
> > > }
> > >
> > > /* Perform the minimal folding on statement *GSI. Only operations like
> > > @@ -7112,10 +7127,11 @@ fold_stmt (gimple_stmt_iterator *gsi, tree
> > (*valueize) (tree), bitmap dce_bitmap
> > > which can produce *&x = 0. */
> > >
> > > bool
> > > -fold_stmt_inplace (gimple_stmt_iterator *gsi, tree (*valueize) (tree))
> > > +fold_stmt_inplace (gimple_stmt_iterator *gsi, tree (*valueize) (tree),
> > > + gimple_match_simplify_fn simplifier)
> > > {
> > > gimple *stmt = gsi_stmt (*gsi);
> > > - bool changed = fold_stmt_1 (gsi, true, valueize);
> > > + bool changed = fold_stmt_1 (gsi, true, valueize, simplifier);
> > > gcc_assert (gsi_stmt (*gsi) == stmt);
> > > return changed;
> > > }
> > > @@ -7257,27 +7273,28 @@ same_bool_result_p (const_tree op1,
> > const_tree op2)
> > >
> > > static tree
> > > and_comparisons_1 (tree type, enum tree_code code1, tree op1a, tree
> > op1b,
> > > - enum tree_code code2, tree op2a, tree op2b, basic_block);
> > > + enum tree_code code2, tree op2a, tree op2b, basic_block,
> > > + gimple_match_simplify_fn);
> > > static tree
> > > and_var_with_comparison (tree type, tree var, bool invert,
> > > enum tree_code code2, tree op2a, tree op2b,
> > > - basic_block);
> > > + basic_block, gimple_match_simplify_fn);
> > > static tree
> > > and_var_with_comparison_1 (tree type, gimple *stmt,
> > > enum tree_code code2, tree op2a, tree op2b,
> > > - basic_block);
> > > + basic_block, gimple_match_simplify_fn);
> > > static tree
> > > or_comparisons_1 (tree, enum tree_code code1, tree op1a, tree op1b,
> > > enum tree_code code2, tree op2a, tree op2b,
> > > - basic_block);
> > > + basic_block, gimple_match_simplify_fn);
> > > static tree
> > > or_var_with_comparison (tree, tree var, bool invert,
> > > enum tree_code code2, tree op2a, tree op2b,
> > > - basic_block);
> > > + basic_block, gimple_match_simplify_fn);
> > > static tree
> > > or_var_with_comparison_1 (tree, gimple *stmt,
> > > enum tree_code code2, tree op2a, tree op2b,
> > > - basic_block);
> > > + basic_block, gimple_match_simplify_fn);
> > >
> > > /* Helper function for and_comparisons_1: try to simplify the AND of the
> > > ssa variable VAR with the comparison specified by (OP2A CODE2 OP2B).
> > > @@ -7287,7 +7304,8 @@ or_var_with_comparison_1 (tree, gimple *stmt,
> > > static tree
> > > and_var_with_comparison (tree type, tree var, bool invert,
> > > enum tree_code code2, tree op2a, tree op2b,
> > > - basic_block outer_cond_bb)
> > > + basic_block outer_cond_bb,
> > > + gimple_match_simplify_fn simplifier)
> > > {
> > > tree t;
> > > gimple *stmt = SSA_NAME_DEF_STMT (var);
> > > @@ -7302,10 +7320,10 @@ and_var_with_comparison (tree type, tree var,
> > bool invert,
> > > if (invert)
> > > t = or_var_with_comparison_1 (type, stmt,
> > > invert_tree_comparison (code2, false),
> > > - op2a, op2b, outer_cond_bb);
> > > + op2a, op2b, outer_cond_bb, simplifier);
> > > else
> > > t = and_var_with_comparison_1 (type, stmt, code2, op2a, op2b,
> > > - outer_cond_bb);
> > > + outer_cond_bb, simplifier);
> > > return canonicalize_bool (t, invert);
> > > }
> > >
> > > @@ -7316,7 +7334,8 @@ and_var_with_comparison (tree type, tree var,
> > bool invert,
> > > static tree
> > > and_var_with_comparison_1 (tree type, gimple *stmt,
> > > enum tree_code code2, tree op2a, tree op2b,
> > > - basic_block outer_cond_bb)
> > > + basic_block outer_cond_bb,
> > > + gimple_match_simplify_fn simplifier)
> > > {
> > > tree var = gimple_assign_lhs (stmt);
> > > tree true_test_var = NULL_TREE;
> > > @@ -7351,7 +7370,7 @@ and_var_with_comparison_1 (tree type, gimple
> > *stmt,
> > > gimple_assign_rhs2 (stmt),
> > > code2,
> > > op2a,
> > > - op2b, outer_cond_bb);
> > > + op2b, outer_cond_bb, simplifier);
> > > if (t)
> > > return t;
> > > }
> > > @@ -7383,12 +7402,12 @@ and_var_with_comparison_1 (tree type,
> > gimple *stmt,
> > > return (is_and
> > > ? boolean_false_node
> > > : and_var_with_comparison (type, inner2, false, code2, op2a,
> > > - op2b, outer_cond_bb));
> > > + op2b, outer_cond_bb, simplifier));
> > > else if (inner2 == false_test_var)
> > > return (is_and
> > > ? boolean_false_node
> > > : and_var_with_comparison (type, inner1, false, code2, op2a,
> > > - op2b, outer_cond_bb));
> > > + op2b, outer_cond_bb, simplifier));
> > >
> > > /* Next, redistribute/reassociate the AND across the inner tests.
> > > Compute the first partial result, (inner1 AND (op2a code op2b)) */
> > > @@ -7399,7 +7418,8 @@ and_var_with_comparison_1 (tree type, gimple
> > *stmt,
> > > gimple_assign_rhs1 (s),
> > > gimple_assign_rhs2 (s),
> > > code2, op2a, op2b,
> > > - outer_cond_bb)))
> > > + outer_cond_bb,
> > > + simplifier)))
> > > {
> > > /* Handle the AND case, where we are reassociating:
> > > (inner1 AND inner2) AND (op2a code2 op2b)
> > > @@ -7432,7 +7452,8 @@ and_var_with_comparison_1 (tree type, gimple
> > *stmt,
> > > gimple_assign_rhs1 (s),
> > > gimple_assign_rhs2 (s),
> > > code2, op2a, op2b,
> > > - outer_cond_bb)))
> > > + outer_cond_bb,
> > > + simplifier)))
> > > {
> > > /* Handle the AND case, where we are reassociating:
> > > (inner1 AND inner2) AND (op2a code2 op2b)
> > > @@ -7487,7 +7508,8 @@ and_var_with_comparison_1 (tree type, gimple
> > *stmt,
> > > static tree
> > > and_comparisons_1 (tree type, enum tree_code code1, tree op1a, tree
> > op1b,
> > > enum tree_code code2, tree op2a, tree op2b,
> > > - basic_block outer_cond_bb)
> > > + basic_block outer_cond_bb,
> > > + gimple_match_simplify_fn simplifier)
> > > {
> > > tree truth_type = truth_type_for (TREE_TYPE (op1a));
> > >
> > > @@ -7531,7 +7553,7 @@ and_comparisons_1 (tree type, enum tree_code
> > code1, tree op1a, tree op1b,
> > > case GIMPLE_ASSIGN:
> > > /* Try to simplify by copy-propagating the definition. */
> > > return and_var_with_comparison (type, op1a, invert, code2, op2a,
> > > - op2b, outer_cond_bb);
> > > + op2b, outer_cond_bb, simplifier);
> > >
> > > case GIMPLE_PHI:
> > > /* If every argument to the PHI produces the same result when
> > > @@ -7583,7 +7605,8 @@ and_comparisons_1 (tree type, enum tree_code
> > code1, tree op1a, tree op1b,
> > > return NULL_TREE;
> > > temp = and_var_with_comparison (type, arg, invert,
> > code2,
> > > op2a, op2b,
> > > - outer_cond_bb);
> > > + outer_cond_bb,
> > > + simplifier);
> > > if (!temp)
> > > return NULL_TREE;
> > > else if (!result)
> > > @@ -7648,7 +7671,8 @@ maybe_fold_comparisons_from_match_pd (tree
> > type, enum tree_code code,
> > > tree op1a, tree op1b,
> > > enum tree_code code2, tree op2a,
> > > tree op2b,
> > > - basic_block outer_cond_bb)
> > > + basic_block outer_cond_bb,
> > > + gimple_match_simplify_fn simplifier)
> > > {
> > > /* Allocate gimple stmt1 on the stack. */
> > > gassign *stmt1
> > > @@ -7690,6 +7714,7 @@ maybe_fold_comparisons_from_match_pd (tree
> > type, enum tree_code code,
> > > gimple_match_op op (gimple_match_cond::UNCOND, code,
> > > type, gimple_assign_lhs (stmt1),
> > > gimple_assign_lhs (stmt2));
> > > + op.set_simplifier (simplifier);
> > > fosa_bb = outer_cond_bb;
> > > auto_vec<std::pair<tree, flow_sensitive_info_storage>, 8> unwind_stack;
> > > fosa_unwind = &unwind_stack;
> > > @@ -9203,19 +9228,21 @@ tree
> > > maybe_fold_and_comparisons (tree type,
> > > enum tree_code code1, tree op1a, tree op1b,
> > > enum tree_code code2, tree op2a, tree op2b,
> > > - basic_block outer_cond_bb)
> > > + basic_block outer_cond_bb,
> > > + gimple_match_simplify_fn simplifier)
> > > {
> > > if (tree t = and_comparisons_1 (type, code1, op1a, op1b, code2, op2a,
> > op2b,
> > > - outer_cond_bb))
> > > + outer_cond_bb, simplifier))
> > > return t;
> > >
> > > if (tree t = and_comparisons_1 (type, code2, op2a, op2b, code1, op1a,
> > op1b,
> > > - outer_cond_bb))
> > > + outer_cond_bb, simplifier))
> > > return t;
> > >
> > > if (tree t = maybe_fold_comparisons_from_match_pd (type,
> > BIT_AND_EXPR, code1,
> > > op1a, op1b, code2, op2a,
> > > - op2b, outer_cond_bb))
> > > + op2b, outer_cond_bb,
> > > + simplifier))
> > > return t;
> > >
> > > return NULL_TREE;
> > > @@ -9229,7 +9256,8 @@ maybe_fold_and_comparisons (tree type,
> > > static tree
> > > or_var_with_comparison (tree type, tree var, bool invert,
> > > enum tree_code code2, tree op2a, tree op2b,
> > > - basic_block outer_cond_bb)
> > > + basic_block outer_cond_bb,
> > > + gimple_match_simplify_fn simplifier)
> > > {
> > > tree t;
> > > gimple *stmt = SSA_NAME_DEF_STMT (var);
> > > @@ -9244,10 +9272,10 @@ or_var_with_comparison (tree type, tree var,
> > bool invert,
> > > if (invert)
> > > t = and_var_with_comparison_1 (type, stmt,
> > > invert_tree_comparison (code2, false),
> > > - op2a, op2b, outer_cond_bb);
> > > + op2a, op2b, outer_cond_bb, simplifier);
> > > else
> > > t = or_var_with_comparison_1 (type, stmt, code2, op2a, op2b,
> > > - outer_cond_bb);
> > > + outer_cond_bb, simplifier);
> > > return canonicalize_bool (t, invert);
> > > }
> > >
> > > @@ -9258,7 +9286,8 @@ or_var_with_comparison (tree type, tree var,
> > bool invert,
> > > static tree
> > > or_var_with_comparison_1 (tree type, gimple *stmt,
> > > enum tree_code code2, tree op2a, tree op2b,
> > > - basic_block outer_cond_bb)
> > > + basic_block outer_cond_bb,
> > > + gimple_match_simplify_fn simplifier)
> > > {
> > > tree var = gimple_assign_lhs (stmt);
> > > tree true_test_var = NULL_TREE;
> > > @@ -9291,7 +9320,8 @@ or_var_with_comparison_1 (tree type, gimple
> > *stmt,
> > > tree t = or_comparisons_1 (type, innercode,
> > > gimple_assign_rhs1 (stmt),
> > > gimple_assign_rhs2 (stmt),
> > > - code2, op2a, op2b, outer_cond_bb);
> > > + code2, op2a, op2b, outer_cond_bb,
> > > + simplifier);
> > > if (t)
> > > return t;
> > > }
> > > @@ -9323,12 +9353,12 @@ or_var_with_comparison_1 (tree type, gimple
> > *stmt,
> > > return (is_or
> > > ? boolean_true_node
> > > : or_var_with_comparison (type, inner2, false, code2, op2a,
> > > - op2b, outer_cond_bb));
> > > + op2b, outer_cond_bb, simplifier));
> > > else if (inner2 == false_test_var)
> > > return (is_or
> > > ? boolean_true_node
> > > : or_var_with_comparison (type, inner1, false, code2, op2a,
> > > - op2b, outer_cond_bb));
> > > + op2b, outer_cond_bb, simplifier));
> > >
> > > /* Next, redistribute/reassociate the OR across the inner tests.
> > > Compute the first partial result, (inner1 OR (op2a code op2b)) */
> > > @@ -9339,7 +9369,8 @@ or_var_with_comparison_1 (tree type, gimple
> > *stmt,
> > > gimple_assign_rhs1 (s),
> > > gimple_assign_rhs2 (s),
> > > code2, op2a, op2b,
> > > - outer_cond_bb)))
> > > + outer_cond_bb,
> > > + simplifier)))
> > > {
> > > /* Handle the OR case, where we are reassociating:
> > > (inner1 OR inner2) OR (op2a code2 op2b)
> > > @@ -9372,7 +9403,8 @@ or_var_with_comparison_1 (tree type, gimple
> > *stmt,
> > > gimple_assign_rhs1 (s),
> > > gimple_assign_rhs2 (s),
> > > code2, op2a, op2b,
> > > - outer_cond_bb)))
> > > + outer_cond_bb,
> > > + simplifier)))
> > > {
> > > /* Handle the OR case, where we are reassociating:
> > > (inner1 OR inner2) OR (op2a code2 op2b)
> > > @@ -9428,7 +9460,8 @@ or_var_with_comparison_1 (tree type, gimple
> > *stmt,
> > > static tree
> > > or_comparisons_1 (tree type, enum tree_code code1, tree op1a, tree op1b,
> > > enum tree_code code2, tree op2a, tree op2b,
> > > - basic_block outer_cond_bb)
> > > + basic_block outer_cond_bb,
> > > + gimple_match_simplify_fn simplifier)
> > > {
> > > tree truth_type = truth_type_for (TREE_TYPE (op1a));
> > >
> > > @@ -9472,7 +9505,7 @@ or_comparisons_1 (tree type, enum tree_code
> > code1, tree op1a, tree op1b,
> > > case GIMPLE_ASSIGN:
> > > /* Try to simplify by copy-propagating the definition. */
> > > return or_var_with_comparison (type, op1a, invert, code2, op2a,
> > > - op2b, outer_cond_bb);
> > > + op2b, outer_cond_bb, simplifier);
> > >
> > > case GIMPLE_PHI:
> > > /* If every argument to the PHI produces the same result when
> > > @@ -9523,7 +9556,8 @@ or_comparisons_1 (tree type, enum tree_code
> > code1, tree op1a, tree op1b,
> > > gimple_bb (stmt)))
> > > return NULL_TREE;
> > > temp = or_var_with_comparison (type, arg, invert, code2,
> > > - op2a, op2b,
> > outer_cond_bb);
> > > + op2a, op2b,
> > outer_cond_bb,
> > > + simplifier);
> > > if (!temp)
> > > return NULL_TREE;
> > > else if (!result)
> > > @@ -9555,19 +9589,21 @@ tree
> > > maybe_fold_or_comparisons (tree type,
> > > enum tree_code code1, tree op1a, tree op1b,
> > > enum tree_code code2, tree op2a, tree op2b,
> > > - basic_block outer_cond_bb)
> > > + basic_block outer_cond_bb,
> > > + gimple_match_simplify_fn simplifier)
> > > {
> > > if (tree t = or_comparisons_1 (type, code1, op1a, op1b, code2, op2a,
> > op2b,
> > > - outer_cond_bb))
> > > + outer_cond_bb, simplifier))
> > > return t;
> > >
> > > if (tree t = or_comparisons_1 (type, code2, op2a, op2b, code1, op1a,
> > op1b,
> > > - outer_cond_bb))
> > > + outer_cond_bb, simplifier))
> > > return t;
> > >
> > > if (tree t = maybe_fold_comparisons_from_match_pd (type,
> > BIT_IOR_EXPR, code1,
> > > op1a, op1b, code2, op2a,
> > > - op2b, outer_cond_bb))
> > > + op2b, outer_cond_bb,
> > > + simplifier))
> > > return t;
> > >
> > > return NULL_TREE;
> > > @@ -9584,10 +9620,11 @@ maybe_fold_or_comparisons (tree type,
> > >
> > > tree
> > > gimple_fold_stmt_to_constant_1 (gimple *stmt, tree (*valueize) (tree),
> > > - tree (*gvalueize) (tree))
> > > + tree (*gvalueize) (tree),
> > > + gimple_match_simplify_fn simplifier)
> > > {
> > > gimple_match_op res_op;
> > > - res_op.set_simplifier (gimple_simplify);
> > > + res_op.set_simplifier (simplifier);
> > > /* ??? The SSA propagators do not correctly deal with following SSA
> > > use-
> > def
> > > edges if there are intermediate VARYING defs. For this reason
> > > do not follow SSA edges here even though SCCVN can technically
> > > diff --git a/gcc/gimple-fold.h b/gcc/gimple-fold.h
> > > index
> > ca7519c4c8904127ad5a80e1d39101550b397d91..211f8901461fe6dc2086
> > 4cd9ba8c9277ff19dc99 100644
> > > --- a/gcc/gimple-fold.h
> > > +++ b/gcc/gimple-fold.h
> > > @@ -36,17 +36,27 @@ extern tree follow_single_use_edges (tree);
> > > extern tree follow_all_ssa_edges (tree);
> > > extern bool fold_stmt (gimple_stmt_iterator *, bitmap = nullptr);
> > > extern bool fold_stmt (gimple_stmt_iterator *, tree (*) (tree), bitmap =
> > nullptr);
> > > -extern bool fold_stmt_inplace (gimple_stmt_iterator *, tree (*) (tree) =
> > no_follow_ssa_edges);
> > > +extern bool fold_stmt (gimple_stmt_iterator *,
> > > + gimple_match_simplify_fn, bitmap = nullptr);
> > > +extern bool fold_stmt (gimple_stmt_iterator *, tree (*) (tree),
> > > + gimple_match_simplify_fn, bitmap = nullptr);
> > > +extern bool fold_stmt_inplace (gimple_stmt_iterator *,
> > > + tree (*) (tree) = no_follow_ssa_edges,
> > > + gimple_match_simplify_fn = gimple_simplify);
> > > extern tree maybe_fold_and_comparisons (tree, enum tree_code, tree, tree,
> > > enum tree_code, tree, tree,
> > > - basic_block = nullptr);
> > > + basic_block = nullptr,
> > > + gimple_match_simplify_fn =
> > gimple_simplify);
> > > extern tree maybe_fold_or_comparisons (tree, enum tree_code, tree, tree,
> > > enum tree_code, tree, tree,
> > > - basic_block = nullptr);
> > > + basic_block = nullptr,
> > > + gimple_match_simplify_fn =
> > gimple_simplify);
> > > extern bool optimize_atomic_compare_exchange_p (gimple *);
> > > extern void fold_builtin_atomic_compare_exchange (gimple_stmt_iterator
> > *);
> > > extern tree gimple_fold_stmt_to_constant_1 (gimple *, tree (*) (tree),
> > > - tree (*) (tree) =
> > no_follow_ssa_edges);
> > > + tree (*) (tree) =
> > no_follow_ssa_edges,
> > > + gimple_match_simplify_fn
> > > + = gimple_simplify);
> > > extern tree gimple_fold_stmt_to_constant (gimple *, tree (*) (tree));
> > > extern tree fold_ctor_reference (tree, tree, const poly_uint64&,
> > > const poly_uint64&, tree,
> > >
> > >
> > >
> >
> > --
> > Richard Biener <[email protected]>
> > SUSE Software Solutions Germany GmbH,
> > Frankenstrasse 146, 90461 Nuernberg, Germany;
> > GF: Jochen Jaser, Andrew McDonald, Abhinav Puri; (HRB 36809, AG
> > Nuernberg)
>
--
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Jochen Jaser, Andrew McDonald, Abhinav Puri; (HRB 36809, AG Nuernberg)