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

            Bug ID: 81489
           Summary: invalid phi argument used in
                    find_implicit_erroneous_behavior
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: vries at gcc dot gnu.org
  Target Milestone: ---

In find_implicit_erroneous_behavior there's a loop:
...
              /* We've got a NULL PHI argument.  Now see if the
                 PHI's result is dereferenced within BB.  */
              FOR_EACH_IMM_USE_STMT (use_stmt, iter, lhs)
                {
                  /* We only care about uses in BB.  Catching cases in
                     in other blocks would require more complex path
                     isolation code.   */
                  if (gimple_bb (use_stmt) != bb)
                    continue;

                  location_t loc = gimple_location (use_stmt)
                    ? gimple_location (use_stmt)
                    : gimple_phi_arg_location (phi, i);

                  if (stmt_uses_name_in_undefined_way (use_stmt, lhs, loc))
                    {
                      duplicate = isolate_path (bb, duplicate, e,
                                                use_stmt, lhs, false);

                      /* When we remove an incoming edge, we need to            
                         reprocess the Ith element.  */
                      next_i = i;
                      cfg_altered = true;
                    }
                }
...

There's a problem with using 'gimple_phi_arg_location (phi, i)'.

The i is the index of the zero arg in the phi before the loop. But after
isolate_path is called, the phi has one arg less, and i is no longer the index
of the zero arg in the phi. So in the next iteration 'gimple_phi_arg_location
(phi, i)' returns something random.

Mostly we use the gimple_location (use_stmt), so the bug is not easy trigger.

We can make it easier to trigger by always using the loc of the phi argument:
...
                  location_t loc = gimple_phi_arg_location (phi, i);
...

Reply via email to