#pragma clang diagnostic ignored "-Wmissing-prototypes" #include #include using namespace metal; struct foo { int a[128]; uint b; float2 c; }; struct bar { int d; }; struct baz { int e[128]; }; static inline __attribute__((always_inline)) device int* select_buffer(device foo& buf, device baz& buf2, constant bar& cb) { return (cb.d != 0) ? &buf.a[0u] : &buf2.e[0u]; } static inline __attribute__((always_inline)) device int* select_buffer_null(device foo& buf, constant bar& cb) { return (cb.d != 0) ? &buf.a[0u] : nullptr; } static inline __attribute__((always_inline)) threadgroup int* select_tgsm(constant bar& cb, threadgroup int (&tgsm)[128]) { return (cb.d != 0) ? &tgsm[0u] : nullptr; } kernel void main0(device foo& buf [[buffer(0)]], constant bar& cb [[buffer(1)]], device baz& buf2 [[buffer(2)]]) { threadgroup int tgsm[128]; device int* sbuf = select_buffer(buf, buf2, cb); device int* sbuf2 = select_buffer_null(buf, cb); threadgroup int* stgsm = select_tgsm(cb, tgsm); threadgroup int* cur = stgsm; device int* _73; _73 = &buf.a[0u]; threadgroup int* _76; int _77; for (;;) { _76 = cur; _77 = *_73; if (_77 != 0) { int _81 = *_76; int _82 = _77 + _81; *_73 = _82; *_76 = _82; cur = &_76[1u]; _73 = &_73[1u]; continue; } else { break; } } }