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

            Bug ID: 115615
           Summary: SLP permute optimization creates unnecessary permute
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rguenth at gcc dot gnu.org
  Target Milestone: ---

For the testcases in PR115602, notably for the following at -O2 on x86_64
the SLP permute pass is materializing a permute ontop of the following
which is always going to be an identity transform.

t.c:13:6: note: node 0x4ab3690 (max_nunits=2, refcnt=1) vector(2) double
t.c:13:6: note: op template: _11 = gvevent_motion_job.zoom;
t.c:13:6: note:         stmt 0 _11 = gvevent_motion_job.zoom;
t.c:13:6: note:         stmt 1 _11 = gvevent_motion_job.zoom;
t.c:13:6: note:         load permutation { 2 2 }



typedef struct {
  double x, y;
} pointf;
struct {
  pointf focus;
  double zoom;
  pointf devscale;
  char button;
  pointf oldpointer;
} gvevent_motion_job;
char gvevent_motion_job_4;
double gvevent_motion_pointer_1, gvevent_motion_pointer_0;
void gvevent_motion() {
  double dx = (gvevent_motion_pointer_0 - gvevent_motion_job.oldpointer.x) /
              gvevent_motion_job.devscale.x,
         dy = (gvevent_motion_pointer_1 - gvevent_motion_job.oldpointer.y) /
              gvevent_motion_job.devscale.y;
  if (dx && dy < .0001)
    return;
  switch (gvevent_motion_job_4)
  case 2: {
    gvevent_motion_job.focus.x -= dy / gvevent_motion_job.zoom;
    gvevent_motion_job.focus.y += dx / gvevent_motion_job.zoom;
  }
}

Reply via email to