https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126904

            Bug ID: 126904
           Summary: backward threader: no path-sensitive load CSE (value
                    numbering?)
           Product: gcc
           Version: 17.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: aldyh at gcc dot gnu.org
                CC: amacleod at redhat dot com, law at gcc dot gnu.org,
                    rguenth at gcc dot gnu.org
            Blocks: 126010
  Target Milestone: ---

This is one case where FRE/PRE cannot currently rescue the backward threader
from what is currently being done by DOM’s avail_exprs.

[Full disclosure, as mentioned earlier I used Claude Fable to reduce the
missing optimizations I’m auditing for the backwards threader.  Is it useful to
stick an Assisted-by tag here in the PR?  I’ve reduced and verified myself, but
the paragraph analyzing the cause is NOT mine.  For the record, I’m not using
AI to do a report-and-run here… I’m more than happy to do some of the leg work,
answer questions, and reproduce, but I know this is a sensitive subject.]

/* { dg-do compile } */
/* { dg-options "-O2 --param=dom-jump-threading=0
-fdump-tree-threadfull1-details" } */

/* The two conditionals test two different SSA names that are loads
   of the same location *p.  On the path where the first is true
   there is no intervening store, so the second load equals the first
   and the second conditional is false.  DOM's avail-exprs sees this
   and threads the path; the path ranger has no memory value
   numbering, sees the second load as VARYING, and rejects.  FRE/PRE
   cannot pre-empt the problem: foo () on the other arm clobbers *p
   (no full redundancy), and the possibly non-returning spin ()
   before the may-trap load keeps PRE from making it anticipable.  */

void foo (void);

static void __attribute__((noinline))
spin (int n)
{
  while (n)
    ;
}

void
f (int *p, int k)
{
  if (*p == k)
    ;
  else
    foo ();
  spin (k);
  if (*p != k)
    foo ();
}

/* { dg-final { scan-tree-dump-times "Registering jump thread" 1 "threadfull1"
} } */


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126010
[Bug 126010] [meta-bug] Remove DOM

Reply via email to