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; } }