[llvm] [LV] Implement integer part of VPDerivedIV cost model (PR #198252)
Elvina Yakubova via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 8 02:23:30 PDT 2026
ElvinaYakubova wrote:
Hi David,
This commit caused a 25% performance regression of TSVC s351 benchmarks we are tracking. Could you please have a look?
The reproducer is as follows (-O3 -ffast-math -mcpu=neoverse-v2):
```
#define iterations 100000
#define LEN_1D 32000
#define LEN_2D 256
typedef float real_t;
struct args_t {
long t1;
long t2;
};
__attribute__((aligned(64))) real_t a[LEN_1D];
__attribute__((aligned(64))) real_t b[LEN_1D];
__attribute__((aligned(64))) real_t c[LEN_1D];
__attribute__((aligned(64))) real_t d[LEN_1D];
__attribute__((aligned(64))) real_t e[LEN_1D];
__attribute__((aligned(64))) real_t aa[LEN_2D][LEN_2D];
__attribute__((aligned(64))) real_t bb[LEN_2D][LEN_2D];
__attribute__((aligned(64))) real_t cc[LEN_2D][LEN_2D];
real_t s351(struct args_t *func_args) {
// loop rerolling / unrolled saxpy (TSVC S351)
func_args->t1 = 0;
real_t alpha = c[0];
for (int nl = 0; nl < 8 * iterations; nl++) {
for (int i = 0; i < LEN_1D; i += 5) {
a[i] += alpha * b[i];
a[i + 1] += alpha * b[i + 1];
a[i + 2] += alpha * b[i + 2];
a[i + 3] += alpha * b[i + 3];
a[i + 4] += alpha * b[i + 4];
}
// Keep memory live across the outer loop (replaces dummy()).
__asm__ volatile("" : : "r"(a), "r"(b), "r"(c), "r"(d), "r"(e), "r"(aa),
"r"(bb), "r"(cc) : "memory");
}
func_args->t2 = 0;
return a[0] + b[0];
}
```
Before, the loop vectorizer generated a wide vector FMA (ldp + fmla v*.4s).
After that commit, LV rejects vectorization and keeps a scalar loop (ldur + scalar fmadd).
https://github.com/llvm/llvm-project/pull/198252
More information about the llvm-commits
mailing list