On Mon, 10 Aug 2026, Aldy Hernandez wrote:

> As discussed in PR126103, the first step to removing DOM is untangling
> its threader from the rest of DOM.  I've started auditing what we're
> missing in PRE + backwards threader, and need a way to disable DOM's
> threading for the barrage of PRs I'm about to file.
> 
> We already have a way to disable all jump threads, but no way to
> disable just DOM's.  This patch does jhust this with
> --param=dom-jump-threading=[01].  It's in line with what we
> temporarily did for ranger-threading and ranger VRP.
> 
> The --param disables jump threading in DOM, but everything else DOM
> does is unaffected.
> 
> OK for trunk?

OK.

Richard.

> Tested on ppc64le Linux.
> 
>       PR tree-optimization/126103
> 
> gcc/ChangeLog:
> 
>       * doc/params.texi (dom-jump-threading): Document.
>       * params.opt (-param=dom-jump-threading=): New.
>       * tree-ssa-dom.cc (dom_opt_dom_walker::after_dom_children): Honor
>       param_dom_jump_threading.
> 
> gcc/testsuite/ChangeLog:
> 
>       * gcc.dg/tree-ssa/dom-jump-threading-1.c: New test.
>       * gcc.dg/tree-ssa/dom-jump-threading-2.c: New test.
> ---
>  gcc/doc/params.texi                           |  6 +++++
>  gcc/params.opt                                |  4 ++++
>  .../gcc.dg/tree-ssa/dom-jump-threading-1.c    | 24 +++++++++++++++++++
>  .../gcc.dg/tree-ssa/dom-jump-threading-2.c    | 22 +++++++++++++++++
>  gcc/tree-ssa-dom.cc                           |  3 ++-
>  5 files changed, 58 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/dom-jump-threading-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/dom-jump-threading-2.c
> 
> diff --git a/gcc/doc/params.texi b/gcc/doc/params.texi
> index 26b34a59aa9..e69be2d2923 100644
> --- a/gcc/doc/params.texi
> +++ b/gcc/doc/params.texi
> @@ -894,6 +894,12 @@ optimizing.
>  Maximum number of dominators BBs to walk when simplifying loop bounds
>  and conditions.
>  
> +@paindex dom-jump-threading
> +@item dom-jump-threading
> +Enable jump threading in the dominator optimizer pass.  Disabling it
> +is useful to isolate the jump threads found by the backward threader,
> +which runs regardless.
> +
>  @paindex max-jump-thread-duplication-stmts
>  @item max-jump-thread-duplication-stmts
>  Maximum number of statements allowed in a block that needs to be
> diff --git a/gcc/params.opt b/gcc/params.opt
> index 044c4a10bc4..0c6a3e51457 100644
> --- a/gcc/params.opt
> +++ b/gcc/params.opt
> @@ -138,6 +138,10 @@ Probability that COMDAT function is shared with a 
> different compilation unit.
>  Common Joined UInteger Var(param_cxx_max_namespaces_for_diagnostic_help) 
> Init(1000) Param
>  Maximum number of namespaces to search for alternatives when name lookup 
> fails.
>  
> +-param=dom-jump-threading=
> +Common Joined UInteger Var(param_dom_jump_threading) Init(1) IntegerRange(0, 
> 1) Param Optimization
> +Enable jump threading in the dominator optimizer pass.
> +
>  -param=dse-max-alias-queries-per-store=
>  Common Joined UInteger Var(param_dse_max_alias_queries_per_store) Init(256) 
> Param Optimization
>  Maximum number of queries into the alias oracle per store.
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/dom-jump-threading-1.c 
> b/gcc/testsuite/gcc.dg/tree-ssa/dom-jump-threading-1.c
> new file mode 100644
> index 00000000000..a0d0809b176
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/dom-jump-threading-1.c
> @@ -0,0 +1,24 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 --param=dom-jump-threading=0 -fdump-tree-dom2-details 
> -fdump-tree-optimized" } */
> +
> +/* Verify that --param=dom-jump-threading=0 keeps DOM from threading
> +   jumps.  Only DOM can thread a PHI of compares (the backward
> +   threader cannot resolve the exit conditional to a single edge), so
> +   with the param off the join block and its PHI must survive.  */
> +
> +void g (void);
> +
> +void
> +f (int x, int a, int b, int c, int d)
> +{
> +  _Bool t;
> +  if (x)
> +    t = a < b;
> +  else
> +    t = c < d;
> +  if (t)
> +    g ();
> +}
> +
> +/* { dg-final { scan-tree-dump-not "Registering jump thread" "dom2" } } */
> +/* { dg-final { scan-tree-dump "PHI <" "optimized" } } */
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/dom-jump-threading-2.c 
> b/gcc/testsuite/gcc.dg/tree-ssa/dom-jump-threading-2.c
> new file mode 100644
> index 00000000000..fb6b8a12732
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/dom-jump-threading-2.c
> @@ -0,0 +1,22 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-tree-dom2-details" } */
> +
> +/* Same test as dom-jump-threading-1.c but with DOM jump threading at
> +   its default (enabled): DOM must thread the PHI of compares, which
> +   keeps the sibling test honest.  */
> +
> +void g (void);
> +
> +void
> +f (int x, int a, int b, int c, int d)
> +{
> +  _Bool t;
> +  if (x)
> +    t = a < b;
> +  else
> +    t = c < d;
> +  if (t)
> +    g ();
> +}
> +
> +/* { dg-final { scan-tree-dump "Registering jump thread" "dom2" } } */
> diff --git a/gcc/tree-ssa-dom.cc b/gcc/tree-ssa-dom.cc
> index 02ffcbfc677..7fded792a3c 100644
> --- a/gcc/tree-ssa-dom.cc
> +++ b/gcc/tree-ssa-dom.cc
> @@ -1801,7 +1801,8 @@ dom_opt_dom_walker::before_dom_children (basic_block bb)
>  void
>  dom_opt_dom_walker::after_dom_children (basic_block bb)
>  {
> -  m_threader->thread_outgoing_edges (bb);
> +  if (param_dom_jump_threading)
> +    m_threader->thread_outgoing_edges (bb);
>    bitmap_clear_bit (m_state->get_blocks_on_stack (), bb->index);
>    m_avail_exprs_stack->pop_to_marker ();
>    m_const_and_copies->pop_to_marker ();
> 

-- 
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)

Reply via email to