https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118213
Bug ID: 118213
Summary: IVOPT causes superfluous IVs
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: fxue at os dot amperecomputing.com
Target Milestone: ---
See the case,
int foo(char *a, char *b, int s, int n)
{
while (++s != n) {
if (a[s] != b[s])
break;
}
return s;
}
Originally, memory accesses to "a[]" and "b[]" own a same IV, while after
IVOPT, two IVs are generated for each access respectively, difference between
the IVs is 1. This would cause some superfluous IV-related computation in both
loop prolog and body. On aarch64, we would get below suboptimal code-gen:
.LFB0:
.cfi_startproc
add w2, w2, 1
mov x6, x0
sub x1, x1, #1
sxtw x0, w2
b .L2
.p2align 2,,3
.L3:
ldrb w5, [x6, x0] #base: x6 = a, index: x0
ldrb w4, [x1, x2] #base: x1 = b - 1, index: x2 = x0 + 1
cmp w5, w4
bne .L6
mov x0, x2
.L2:
add x2, x0, 1
cmp w3, w0
bne .L3
.L6:
ret