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

            Bug ID: 77824
           Summary: unreachable code in SLSR GIMPLE pass
           Product: gcc
           Version: 7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ebotcazou at gcc dot gnu.org
  Target Milestone: ---

I played a little with the SLSR GIMPLE pass and, while it's clearly written and
very well documented, it contains an oversight which deactivates a small part
of the processing:

/* Given GS which is a copy of a scalar integer type, make at least one
   appropriate entry in the candidate table.

   This interface is included for completeness, but is unnecessary
   if this pass immediately follows a pass that performs copy 
   propagation, such as DOM.  */

static void
slsr_process_copy (gimple *gs, tree rhs1, bool speed)


slsr_process_copy is never invoked because it's called from:

            case MODIFY_EXPR:
              slsr_process_copy (gs, rhs1, speed);
              break;

and there are no MODIFY_EXPRs left in GIMPLE.  I think that all occurrences of
MODIFY_EXPR should be replaced with SSA_NAME in the file.  And, at least in the
case I played with, the additional processing makes a difference because there
are unpropagated copies in the GIMPLE IR.

Another minor nit: in replace_mult_candidate

  if (wi::fits_shwi_p (bump)
      && bump.to_shwi () != HOST_WIDE_INT_MIN
      /* It is not useful to replace casts, copies, or adds of
         an SSA name and a constant.  */
      && cand_code != MODIFY_EXPR
      && !CONVERT_EXPR_CODE_P (cand_code)
      && cand_code != PLUS_EXPR
      && cand_code != POINTER_PLUS_EXPR
      && cand_code != MINUS_EXPR)

Why not just testing c->kind instead of cand_code?

Reply via email to