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

            Bug ID: 116824
           Summary: phiprop gets confused with vop phi
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: enhancement
          Priority: P3
         Component: tree-optimization
          Assignee: pinskia at gcc dot gnu.org
          Reporter: pinskia at gcc dot gnu.org
  Target Milestone: ---

Take:
```
int g(int i, int *tt)
{
  const int t = 10;
  const int *a;
  {
    if (t < i)
    {
      *tt = 1;
      a = &t;
    }
    else
    {
      *tt = 1;
      a = &i;
    }
  }
  return *a;
}
```

phiprop does not move the loads of PHI<&t,&i> into the branch but PRE is able
to. This is because the check:
      if (!SSA_NAME_IS_DEFAULT_DEF (vuse)
          && (gimple_bb (def_stmt) == bb
              || (gimple_bb (def_stmt)
                  && !dominated_by_p (CDI_DOMINATORS,
                                      bb, gimple_bb (def_stmt)))))
        goto next;

is true as `gimple_bb (def_stmt) == bb` but def_stmt here is a phi. 

Note the code that was added to update the vuse manually in
r14-1981-g85107abeb71bbf actually added support for phis.

Reply via email to