diff options
| author | Filipe Cabecinhas <me@filcab.net> | 2016-12-02 15:33:04 +0000 |
|---|---|---|
| committer | Filipe Cabecinhas <me@filcab.net> | 2016-12-02 15:33:04 +0000 |
| commit | 2f461bf24ad7cd6c8c4440c0dbb8cfd33b66c1f1 (patch) | |
| tree | 1d313294816dedc6c55f6ed7dd992efbd0883fdd /compiler-rt | |
| parent | ef62c59dd6b30f4df974eda75adaccaf3148b45d (diff) | |
| download | bcm5719-llvm-2f461bf24ad7cd6c8c4440c0dbb8cfd33b66c1f1.tar.gz bcm5719-llvm-2f461bf24ad7cd6c8c4440c0dbb8cfd33b66c1f1.zip | |
Compiler-rt part of D26230: Add (constant) masked load/store support (Try #2)
Summary:
Unfortunately, there is no way to emit an llvm masked load/store in
clang without optimizations, and AVX enabled. Unsure how we should go
about making sure this test only runs if it's possible to execute AVX
code.
Reviewers: kcc, RKSimon, pgousseau
Subscribers: kubabrecka, dberris, llvm-commits
Differential Revision: https://reviews.llvm.org/D26506
llvm-svn: 288504
Diffstat (limited to 'compiler-rt')
| -rw-r--r-- | compiler-rt/test/asan/TestCases/masked-ops.cpp | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/compiler-rt/test/asan/TestCases/masked-ops.cpp b/compiler-rt/test/asan/TestCases/masked-ops.cpp new file mode 100644 index 00000000000..0ca26ea9460 --- /dev/null +++ b/compiler-rt/test/asan/TestCases/masked-ops.cpp @@ -0,0 +1,102 @@ +// We need optimization to convert target-specific masked loads/stores to llvm +// generic loads/stores +// RUN: %clangxx_asan -o %t %s -mavx -O1 +// RUN: not %run %t l1 2>&1 | FileCheck -check-prefix=CHECK-L1 %s +// RUN: %run %t l6 2>&1 | FileCheck -check-prefix=CHECK-L6 %s +// RUN: %run %t la 2>&1 | FileCheck -check-prefix=CHECK-LA %s +// RUN: not %run %t s1 2>&1 | FileCheck -check-prefix=CHECK-S1 %s +// RUN: %run %t s6 2>&1 | FileCheck -check-prefix=CHECK-S6 %s +// RUN: %run %t sa 2>&1 | FileCheck -check-prefix=CHECK-SA %s +// REQUIRES: x86-target-arch +#include <assert.h> +#include <stdio.h> +#include <x86intrin.h> + +float g_vec3[3] = {1802398064.0, 1881171305.0, 25961.0}; + +void maskedstore_ps_0110(__m128 a) { + _mm_maskstore_ps(g_vec3, (__v4si){0, -1, -1, 0}, a); +} + +void maskedstore_ps_0001(__m128 a) { + _mm_maskstore_ps(g_vec3, (__v4si){0, 0, 0, -1}, a); +} + +void maskedstore_ps_1010(__m128 a) { + _mm_maskstore_ps(g_vec3, (__v4si){-1, 0, -1, 0}, a); +} + +__m128i maskedload_ps_0110() { + return _mm_maskload_ps(g_vec3, (__v4si){0, -1, -1, 0}); +} + +__m128i maskedload_ps_0001() { + return _mm_maskload_ps(g_vec3, (__v4si){0, 0, 0, -1}); +} + +__m128i maskedload_ps_1010() { + return _mm_maskload_ps(g_vec3, (__v4si){-1, 0, -1, 0}); +} + +__m128 a = (__v4sf){1.0, 2.0, 3.0, 4.0}; + +void print_vector(__v4sf v) { + printf("%d,%d,%d,%d\n", (int)v[0], (int)v[1], (int)v[2], (int)v[3]); +} +void print_vector3(float * v) { + printf("%d,%d,%d\n", (int)v[0], (int)v[1], (int)v[2]); +} + +int main(int argc, char **argv) { + assert(argc > 1); + bool isLoad = argv[1][0] == 'l'; + assert(isLoad || argv[1][0] == 's'); + if (isLoad) { + switch (argv[1][1]) { + case '1': { + // CHECK-L1: ERROR: AddressSanitizer + __v4sf v = maskedload_ps_0001(); + print_vector(v); + // Should have blown up + break; + } + case '6': { + // Safe + __v4sf v = maskedload_ps_0110(); + // CHECK-L6: 0,1881171328,25961,0 + print_vector(v); + return 0; + } + case 'a': { + // TODO: Poison middle element + // Safe + __v4sf v = maskedload_ps_1010(); + // CHECK-LA: 1802398080,0,25961,0 + print_vector(v); + return 0; + } + } + } else { + switch (argv[1][1]) { + case '1': + // CHECK-S1: ERROR: AddressSanitizer + maskedstore_ps_0001(a); + // Should have blown up + break; + case '6': + // Safe + maskedstore_ps_0110(a); + // CHECK-S6: 1802398080,2,3 + print_vector3(g_vec3); + return 0; + case 'a': + // TODO: Poison middle element + // Safe + maskedstore_ps_1010(a); + // CHECK-SA: 1,1881171328,3 + print_vector3(g_vec3); + return 0; + } + } + assert(0); +} |

