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)