https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101207
Bug ID: 101207
Summary: [12 Regress] gcc.dg/vect/vect-strided-mult.c fails
after SLP improvements
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Keywords: wrong-code
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: pinskia at gcc dot gnu.org
Target Milestone: ---
Target: aarch64-linux-gnu
So after the recent SLP improvements gcc.dg/vect/vect-strided-mult.c started to
fail on aarch64-linux-gnu .
There was one place where SLP happens where it did not happen before with:
....
|| ires[i].a != iarr[i].b - iarr[i].a
....
|| ires[i].b != iarr[i].b + iarr[i].a
Which produces in optimized:
vect__22.39_7 = MEM <vector(2) unsigned int> [(unsigned int *)_101];
_46 = BIT_FIELD_REF <vect__22.39_7, 32, 32>;
_8 = BIT_FIELD_REF <vect__22.39_7, 32, 0>;
_24 = _8 - _46;
...
_47 = .REDUC_PLUS (vect__22.39_7);
In the assembly code:
- ldr d0, [x1]
- umov w8, v0.s[1]
- fmov w5, s0
- sub w5, w5, w8
....
- addp v0.2s, v0.2s, v0.2s
Where before we did:
+ ldp w6, w3, [x1]
+ sub w8, w3, w6
....
+ add wN, w3, w6
The add should be ok but the subtraction I think is failing.