public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Di Zhao OS <dizhao@os.amperecomputing.com>
To: "gcc-patches@gcc.gnu.org" <gcc-patches@gcc.gnu.org>
Cc: Richard Biener <richard.guenther@gmail.com>
Subject: PING: [PATCH v6] tree-optimization/101186 - extend FRE with "equivalence map" for condition prediction
Date: Tue, 15 Nov 2022 10:44:24 +0000	[thread overview]
Message-ID: <SN6PR01MB4240C77DD4B2A2E6D013480DE8049@SN6PR01MB4240.prod.exchangelabs.com> (raw)
In-Reply-To: <SN6PR01MB424007EDA90A5A4158AB0EE4E8319@SN6PR01MB4240.prod.exchangelabs.com>

Hi,

I saw that Stage 1 of GCC 13 development is just ended. So is this
considered? Or should I bring this up when general development is
reopened?


Thanks,
Di Zhao


> -----Original Message-----
> From: Di Zhao OS
> Sent: Tuesday, October 25, 2022 8:18 AM
> To: gcc-patches@gcc.gnu.org
> Cc: Richard Biener <richard.guenther@gmail.com>
> Subject: [PATCH v6] tree-optimization/101186 - extend FRE with "equivalence
> map" for condition prediction
> 
> Sorry for the late update. I've been on a vacation and then I
> spent some time updating and verifying the patch.
> 
> Attached is a new version of the patch. There are some changes:
> 
> 1. Store equivalences in a vn_pval chain in vn_ssa_aux, rather than
>    in the expression hash table. (Following Richard's suggestion.)
> 2. Extracted insert_single_predicated_value function.
> 3. Simplify record_equiv_from_prev_phi a bit.
> 4. Changed some of the functions' names and tried to improve the
>    comments a little.
> 
> Current status of the new testcases in the patch:
> 
> ssa-fre-200.c	Can also be optimized by evrp
> ssa-fre-201.c	Not optimized in trunk.
> ssa-fre-202.c	foo() can be removed by evrp; while x + b is not
> 		folded.
> ssa-pre-34.c	Not optimized in trunk.
> 
> Initially, this patch is motivated to remove the unreachable codes
> in case like ssa-pre-34.c, in which we need to use equivalence
> relation produced from a preceding condition for another condition.
> VRP didn't optimize that because it needs jump threading to make
> the relation valid at the second condition.
> 
> After browsing the mechanisms of VRP and FRE, it seems to me there
> are two options: 1) Teach VRP to identify related but not threaded
> conditions. That might require introducing value-numbering into VRP
> to detect common expressions, and I think is too much for this.
> 2) Introduce temporary equivalence in sccvn, which I thought would
> change less on current code. (And along the reviews and updating
> patch I see how ad-hoc it was.)
> 
> I saw from the talk about VN there's plan to replace predicated
> values by ranger. So how does it goes? Is there something I can help
> with? (For the case ssa-pre-34.c, I think maybe it still needs the
> predicated-value support, to lookup related conditional expressions.)
> 
> Below are about questions in the last review:
> 
> > >  /* Valid hashtables storing information we have proven to be
> > >     correct.  */
> > > @@ -490,9 +492,9 @@ VN_INFO (tree name)
> > >  	    nary->predicated_values = 0;
> > >  	    nary->u.result = boolean_true_node;
> > >  	    vn_nary_op_insert_into (nary, valid_info->nary);
> > > -	    gcc_assert (nary->unwind_to == NULL);
> >
> > why's that?  doesn't this mean unwinding will be broken?
> 
> Previously, predicate "argument_x == NULL" or "argument_x != NULL"
> is always new here (because argument_x's VN is just inserted.)
> But with the patch, there can be slot for "argument_x == NULL"
> or "argument_x != NULL" already. It won't break unwinding as the
> new value is not linked to the unwind-chain.
> 
> >
> > >  	    /* Also do not link it into the undo chain.  */
> > >  	    last_inserted_nary = nary->next;
> > > +	    /* There could be a predicate already.  */
> > >  	    nary->next = (vn_nary_op_t)(void *)-1;
> > >  	    nary = alloc_vn_nary_op_noinit (2, &vn_tables_insert_obstack);
> > >  	    init_vn_nary_op_from_pieces (nary, 2, EQ_EXPR,
> 
> > >  /* Compute and return the hash value for nary operation VBO1.  */
> > >
> > >  hashval_t
> > > @@ -4226,6 +4342,9 @@ init_vn_nary_op_from_stmt (vn_nary_op_t vno, gassign
> *stmt)
> > >        for (i = 0; i < vno->length; ++i)
> > >  	vno->op[i] = gimple_op (stmt, i + 1);
> > >      }
> > > +  /* Insert and lookup N-ary results by the operands' equivalence heads.
> */
> > > +  if (gimple_bb (stmt))
> > > +    lookup_equiv_heads (vno->length, vno->op, vno->op, gimple_bb (stmt));
> >
> > That seems like the wrong place, the function didn't even valueize before.
> 
> To utilize temp-equivalences and get more simplified result, n-ary
> expressions should be always inserted and lookup by the operands'
> equivalence heads. So practically all the places
> init_vn_nary_op_from_stmt is used, lookup_equiv_heads (changed to
> get_equiv_heads) should be called. As I haven't found better place
> to put that, I just left it here in the patch..
> 
> > >  visit_nary_op (tree lhs, gassign *stmt)
> > >  {
> > >    vn_nary_op_t vnresult;
> > > -  tree result = vn_nary_op_lookup_stmt (stmt, &vnresult);
> > > -  if (! result && vnresult)
> > > +  unsigned length = vn_nary_length_from_stmt (stmt);
> > > +  vn_nary_op_t vno
> > > +    = XALLOCAVAR (struct vn_nary_op_s, sizeof_vn_nary_op (length));
> > > +  init_vn_nary_op_from_stmt (vno, stmt);
> > > +  tree result = NULL_TREE;
> > > +  /* Try to get a simplified result.  */
> > > +  /* Do not simplify variable used in PHI at loop exit, or
> > > +     simplify_peeled_chrec/constant_after_peeling may miss the loop.  */
> > > +  gimple *use_stmt;
> > > +  use_operand_p use_p;
> > > +  if (!(single_imm_use (lhs, &use_p, &use_stmt)
> > > +	&& gimple_code (use_stmt) == GIMPLE_PHI
> > > +	&& single_succ_p (gimple_bb (use_stmt))
> > > +	&& (single_succ_edge (gimple_bb (use_stmt))->flags & EDGE_DFS_BACK)))
> > > +    result = fold_const_from_equiv_heads (vno->length, vno->opcode, vno-
> >op,
> > > +					  vno->type);
> >
> > copy propagating conditional equivalences has proved problematic, why
> > do this at all when there's no actual simplification?  It's a bit odd that
> > we need a special fold_const_from_equiv_heads here, why is general
> > valueization not handling equivalences?  Are they supposed to be only
> > used for simplifying conditionals?
> 
> With temporary equivalences introduced, expressions like "a - equiv(a)"
> and "a == equiv (a)" can be folded, and no need to store predicates
> like "a == b is true". The function fold_const_from_equiv_heads is
> intended to limit the usage of gimple_simplify, to when a constant can
> be folded using equivalences. The code seems too complex but I haven't
> figured out how to improve it yet. (I'm not very acquainted on how to
> use the simplifying utility properly, I hope I can get some advices
> here.) Also, could I have more details about "copy propagating
> conditional equivalences has proved problematic" ?
> 
> Thank you very much,
> Di Zhao
> 
> ----
> 
> Extend FRE with temporary equivalences.
> 
> 2022-10-24  Di Zhao  <dizhao@os.amperecomputing.com>
> 
> gcc/ChangeLog:
> 
>         * tree-ssa-sccvn.cc (VN_INFO): remove assertions (there could be
>         a predicate already).
>         (dominated_by_p_w_unex): Moved upward.
>         (is_pval_valid_at_bb): Check if vn_pval is valid at BB.
>         (get_equiv_head): Returns the "equivalence head" of given node.
>         (get_equiv_heads): Get the "equivalence head"s of given nodes.
>         (init_vn_nary_op_from_stmt): Insert and lookup nary expressions
>         by "equivalence head"s.
>         (insert_single_predicated_value): Extracted utility.
>         (vn_nary_op_insert_into): Use the extracted utility
>         insert_single_predicated_value.
>         (fold_const_from_equiv_heads): Fold N-ary expression to constant
>         by equiv-heads.
>         (push_new_nary_ref): Insert a back-reference to vn_nary_op_t.
>         (alloc_single_predicated_value): Extracted utility.
>         (push_single_equiv): Push a new value to the equivalence list.
>         (record_temporary_equivalence): Record temporary equivalence.
>         (vn_nary_op_insert_pieces_predicated): Record equivalences
>         instead of some predicates; insert back-refs.
>         (record_equiv_from_prev_phi_1): Record temporary equivalences
>         generated by PHI nodes.
>         (record_equiv_from_prev_phi): Given a taken edge of a conditional
>         branch, record equivalences generated by PHI nodes.
>         (visit_nary_op): Lookup previous results of N-ary operations by
>         equivalences.
>         (insert_related_predicates_on_edge): Some predicates can be
>         computed from equivalences, no need to insert them.
>         (process_bb): Add lookup predicated values by equivalences.
>         (struct unwind_state): Unwind state of back-refs and temporary
>         equivalences.
>         (do_unwind): Unwind the back-refs and temporary equivalences.
>         (do_rpo_vn_1): Update unwind state of back-reference and
>         temporary equivalences.
>         * tree-ssa-sccvn.h (struct temp_equiv): In vn_ssa_aux, hold a
>         list of temporary equivalences.
>         (struct nary_ref): In vn_ssa_aux, hold a lists of references to
>         the nary map entries.
> 
> gcc/testsuite/ChangeLog:
> 
>         * g++.dg/pr83541.C: Disable fre.
>         * gcc.dg/tree-ssa/pr68619-2.c: Disable fre.
>         * gcc.dg/tree-ssa/pr71947-1.c: Disable fre.
>         * gcc.dg/tree-ssa/pr71947-2.c: Disable fre.
>         * gcc.dg/tree-ssa/pr71947-3.c: Disable fre.
>         * gcc.dg/tree-ssa/pr71947-5.c: Disable fre.
>         * gcc.dg/tree-ssa/pr71947-7.c: Disable fre.
>         * gcc.dg/tree-ssa/pr71947-8.c: Disable fre.
>         * gcc.dg/tree-ssa/pr71947-9.c: Disable fre.
>         * gcc.dg/tree-ssa/vrp03.c: Disable fre.
>         * gcc.dg/tree-ssa/ssa-fre-200.c: New test.
>         * gcc.dg/tree-ssa/ssa-fre-201.c: New test.
>         * gcc.dg/tree-ssa/ssa-fre-202.c: New test.
>         * gcc.dg/tree-ssa/ssa-pre-34.c: New test.

  reply	other threads:[~2022-11-15 10:44 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-25  0:18 Di Zhao OS
2022-11-15 10:44 ` Di Zhao OS [this message]
2022-11-15 16:00   ` PING: " Jeff Law

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=SN6PR01MB4240C77DD4B2A2E6D013480DE8049@SN6PR01MB4240.prod.exchangelabs.com \
    --to=dizhao@os.amperecomputing.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=richard.guenther@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).