[PATCH] D101555: [SLP]Improve handling of compensate external uses cost.
Jordan Rupprecht via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue May 25 19:16:13 PDT 2021
rupprecht added a comment.
In D101555#2780152 <https://reviews.llvm.org/D101555#2780152>, @ABataev wrote:
> In D101555#2780145 <https://reviews.llvm.org/D101555#2780145>, @rupprecht wrote:
>
>> We're seeing some test failures that bisected to this patch, possibly a miscompile. The test failure is in the unit test for this file: https://github.com/google/tink/blob/master/cc/subtle/aes_eax_aesni.cc. Are there already any known issues with this patch?
>
> No, there are not. It would help if you could provide the reproducer and exact compile command to check if the problem exists.
I was unsuccessful in getting it to repro directly from the open source repo. However I reduced this which shows the issue:
$ cat repro.cc
#include <xmmintrin.h>
#include <cstdint>
#include <cstdio>
#include <cstring>
// https://github.com/google/tink/blob/a72c9d542cd1dd8b58b2620ab52585cf5544f212/cc/subtle/aes_eax_aesni.cc#L79
inline __m128i Add(__m128i x, uint64_t y) {
// Convert to a vector of two uint64_t.
uint64_t vec[2];
_mm_storeu_si128(reinterpret_cast<__m128i *>(vec), x);
// Perform the addition on the vector.
vec[0] += y;
if (y > vec[0]) {
vec[1]++;
}
// Convert back to xmm.
return _mm_loadu_si128(reinterpret_cast<__m128i *>(vec));
}
void print128(__m128i var) {
uint64_t parts[2];
memcpy(parts, &var, sizeof(parts));
printf("%lu %lu\n", parts[0], parts[1]);
}
template <class T>
void DoNotOptimize(const T &var) {
asm volatile("" : "+m"(const_cast<T &>(var)));
}
int main() {
__m128i x = _mm_setzero_si128();
DoNotOptimize(x);
__m128i y = Add(x, 1);
print128(x);
print128(y);
}
$ clang++ repro.cc -o /tmp/miscompile -O2 -fno-slp-vectorize && /tmp/miscompile
0 0
1 0
$ clang++ repro.cc -o /tmp/miscompile -O2 && /tmp/miscompile
0 0
1 1
Prior to this patch, there is no difference when enabling or disabling `-fslp-vectorize`. The issue seems to be how this optimizes `Add`:
vec[0] += y;
if (y > vec[0]) { // This effectively evaluates to true
vec[1]++;
}
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D101555/new/
https://reviews.llvm.org/D101555
More information about the llvm-commits
mailing list