https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117252
Bug ID: 117252
Summary: SLSR does not always handle mem_refs
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: enhancement
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: pinskia at gcc dot gnu.org
Target Milestone: ---
Take:
```
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-dom3" } */
struct x
{
int a[16];
int b[16];
int c[16];
};
extern void foo (int, int, int);
void
f1 (int *p, __SIZE_TYPE__ n)
{
foo (p[n], p[16+n], p[n+2*16]);
}
/* { dg-final { scan-tree-dump-times "\\* 4;" 1 "dom3" { target { int32 } } } }
*/
/* { dg-final { scan-tree-dump-times "\\* 2;" 1 "dom3" { target { int16 } } } }
*/
/* { dg-final { scan-tree-dump-times "p_\\d\+\\(D\\) \\+ \[^\r\n\]*_\\d\+;" 1
"dom3" } } */
/*
{ dg-final { scan-tree-dump-times "MEM *<int>? *\\\[\\(struct x
\\*\\)\[^\r\n\]*_\\d\+" 3 "dom3" } } */
```
Currently SLSR produces:
```
_1 = n_12(D) * 4;
_2 = p_13(D) + _1;
_3 = *_2;
_5 = _1 + 64;
_6 = p_13(D) + _5;
_7 = *_6;
_9 = _5 + 64;
_10 = p_13(D) + _9;
_11 = *_10;
foo (_3, _7, _11);
```
Which is good that is able to remove the multiple n*4 but it does not remove
the redundant `p + _1 ` (which is removed on the rtl level later on).
Note this is a reduced testcase from gcc.dg/tree-ssa/slsr-27.c if we expand out
the array reference early.