[llvm-bugs] [Bug 50798] New: [SIMD] code not recognized as all_true

via llvm-bugs llvm-bugs at lists.llvm.org
Tue Jun 22 06:59:02 PDT 2021


https://bugs.llvm.org/show_bug.cgi?id=50798

            Bug ID: 50798
           Summary: [SIMD] code not recognized as all_true
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: Windows NT
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Backend: WebAssembly
          Assignee: unassignedbugs at nondot.org
          Reporter: clang at evan.coeusgroup.com
                CC: llvm-bugs at lists.llvm.org

LLVM doesn't recognize that it can optimize these functions to an *.all_true
instruction..  This one might be a bit too specialized; it doesn't surprise me
at all that LLVM doesn't generate an *.all_true instruction.  Still, it would
be nice since the scalar version is pretty bad.

I've included an OpenMP SIMD annotation to try to help the compiler, but
obviously it would be better if it weren't required.

Here is the example, or on Compiler Explorer at https://godbolt.org/z/x3xshzYrf
if you prefer:


#include <stdint.h>

#pragma clang diagnostic ignored "-Wmissing-prototypes"

/* Because of <https://bugs.llvm.org/show_bug.cgi?id=45959>, not
 * a WASM issue. */
#pragma clang diagnostic ignored "-Wsign-conversion"

typedef int8_t i8x16 __attribute__((__vector_size__(16)));
typedef int16_t i16x8 __attribute__((__vector_size__(16)));
typedef int32_t i32x4 __attribute__((__vector_size__(16)));
typedef int64_t i64x2 __attribute__((__vector_size__(16)));

int
i8x16_all_true(i8x16 a) {
    int8_t r = ~0;
    #pragma omp simd reduction(&:r)
    for (int i = 0 ; i < 16 ; i++) {
        r &= a[i];
    }
    return !!r;
}

int
i8x16_all_true_intrin(i8x16 a) {
    return __builtin_wasm_all_true_i8x16(a);
}

int
i16x8_all_true(i16x8 a) {
    int16_t r = ~0;
    #pragma omp simd reduction(&:r)
    for (int i = 0 ; i < 8 ; i++) {
        r &= a[i];
    }
    return !!r;
}

int
i16x8_all_true_intrin(i16x8 a) {
    return __builtin_wasm_all_true_i16x8(a);
}

int
i32x4_all_true(i32x4 a) {
    int32_t r = ~0;
    #pragma omp simd reduction(&:r)
    for (int i = 0 ; i < 4 ; i++) {
        r &= a[i];
    }
    return !!r;
}

int
i32x4_all_true_intrin(i32x4 a) {
    return __builtin_wasm_all_true_i32x4(a);
}

int
i64x2_all_true(i64x2 a) {
    int64_t r = ~0;
    #pragma omp simd reduction(&:r)
    for (int i = 0 ; i < 2 ; i++) {
        r &= a[i];
    }
    return !!r;
}

int
i64x2_all_true_intrin(i64x2 a) {
    return __builtin_wasm_all_true_i64x2(a);
}

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20210622/f1776b00/attachment-0001.html>


More information about the llvm-bugs mailing list