diff --git a/compiler-rt/test/msan/counting_zeroes.c b/compiler-rt/test/msan/counting_zeroes.c new file mode 100644 --- /dev/null +++ b/compiler-rt/test/msan/counting_zeroes.c @@ -0,0 +1,74 @@ +// unsupported: c++03, c++11, c++14, c++17 + +// RUN: %clang_msan %s -o %t && %run %t %p + +#ifdef kda_COMMENTED_OUT +#include +#include "int_lib.h" +#include "sanitizer_common.h" +#endif /* kda_COMMENTED_OUT */ + +#include +#include +#include +#include + +uint64_t foo(int64_t* x) { +#ifdef kda_COMMENTED_OUT + uint64_t res = __builtin_clzll(((uint64_t)(x[0]) << 1) ^ (uint64_t)(x[0] >> 63)); +#endif /* kda_COMMENTED_OUT */ + volatile uint64_t encoded = ((uint64_t)(*x) << 1) ^ (uint64_t)(*x >> 63); +#ifdef kda_COMMENTED_OUT + volatile uint64_t encoded = (*(uint64_t*)(x) << 1) ^ (*(uint64_t*)(x) >> 63); +#endif /* kda_COMMENTED_OUT */ + uint64_t res = __builtin_clzll(encoded | 1) - 1; +#ifdef kda_COMMENTED_OUT + uint64_t res = __builtin_clzll(*x); +#endif /* kda_COMMENTED_OUT */ + return res; +} + +void setValue(void* memory, int index, int64_t value) { + ((int64_t*)memory)[index] = value; +} + + +int main() { +#ifdef kda_COMMENTED_OUT + int64_t x[] = {5, 6}; +#endif /* kda_COMMENTED_OUT */ + +#ifdef kda_COMMENTED_OUT + void* x = malloc(2 * sizeof(int64_t)); + setValue(x, 0, 5); +#endif /* kda_COMMENTED_OUT */ + + __int128 x; +#ifdef kda_COMMENTED_OUT + ((int64_t*)(&x))[0] = 5; +#endif /* kda_COMMENTED_OUT */ + x = 5; + + + __int128 res = __builtin_clzll(x); +#ifdef kda_COMMENTED_OUT + uint64_t res = __builtin_clzll(((int64_t*)x)[0]); +#endif /* kda_COMMENTED_OUT */ +#ifdef kda_COMMENTED_OUT + uint64_t res = __builtin_clzll(x); +#endif /* kda_COMMENTED_OUT */ +#ifdef kda_COMMENTED_OUT + uint64_t res = __builtin_clzll(((int64_t*)x)[0]); +#endif /* kda_COMMENTED_OUT */ +#ifdef kda_COMMENTED_OUT + uint64_t res; + res = foo(&x); +#endif /* kda_COMMENTED_OUT */ +#ifdef kda_COMMENTED_OUT + printf("res: %lu\n", res); + res = foo(((int64_t*)x)[1]); + printf("res: %lu\n", res); + assert(res == 60); +#endif /* kda_COMMENTED_OUT */ + return 0; +}