https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117057
Bug ID: 117057 Summary: [15 Regression] XFAIL of parts of gcc.dg/strlenopt-32.c, strlenopt doesn't handle MEM[&string + CST] = { 0, a_1 }; 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: --- gcc.dg/strlenopt-32.c has XFAILed the optimization for f9() and f10() because the strlen pass doesn't handle _11 = {0, b_6(D)}; __builtin_memcpy (&a, "foo.bar", 8); MEM <vector(2) char> [(char *)&a + 3B] = _11; _9 = strlen (&a); this vectorization is new and some backends expose v2qi and unaligned stores of that. On x86 the assembly for such a store is xorl %eax, %eax movb %dl, %ah movw %ax, 3(%rdi) compared to movb %dl, 4(%rsp) movb $0, 3(%rsp) both are same size, the xor can execute in rename stage and one less store buffer entry is used and a bigger store allows more store-to-load forwarding, so the vectorizing isn't a clear miss (store merging doesn't handle this case).