// RUN: %clang_cc1 %s -finclude-default-header -cl-std=clc++ -fblocks -O0 -emit-llvm -o - -triple "spir-unknown-unknown" | FileCheck %s

void testBranchingOnEnqueueKernel(queue_t default_queue, unsigned flags, ndrange_t ndrange) {
    // Ensure `enqueue_kernel` can be branched upon.

    if (enqueue_kernel(default_queue, flags, ndrange, ^(void) {}))
        (void)0;
    // CHECK: [[P:%[0-9]+]] = call i32 @__enqueue_kernel
    // CHECK-NEXT: [[Q:%[a-z0-9]+]] = icmp ne i32 [[P]], 0
    // CHECK-NEXT: br i1 [[Q]]

    if (get_kernel_work_group_size(^(void) {}))
        (void)0;
    // CHECK: [[P:%[0-9]+]] = call i32 @__get_kernel_work_group_size
    // CHECK-NEXT: [[Q:%[a-z0-9]+]] = icmp ne i32 [[P]], 0
    // CHECK-NEXT: br i1 [[Q]]

    if (get_kernel_preferred_work_group_size_multiple(^(void) {}))
        (void)0;
    // CHECK: [[P:%[0-9]+]] = call i32 @__get_kernel_preferred_work_group_size_multiple_impl
    // CHECK-NEXT: [[Q:%[a-z0-9]+]] = icmp ne i32 [[P]], 0
    // CHECK-NEXT: br i1 [[Q]]
}

void testBranchinOnPipeOperations(read_only pipe int r, write_only pipe int w, global int* ptr) {
    // Verify that return type is correctly casted to i1 value.

    if (read_pipe(r, ptr))
        (void)0;
    // CHECK: [[R:%[0-9]+]] = call i32 @__read_pipe_2
    // CHECK-NEXT: icmp ne i32 [[R]], 0

    if (write_pipe(w, ptr))
        (void)0;
    // CHECK: [[R:%[0-9]+]] = call i32 @__write_pipe_2
    // CHECK-NEXT: icmp ne i32 [[R]], 0

    if (get_pipe_num_packets(r))
        (void)0;
    // CHECK: [[R:%[0-9]+]] = call i32 @__get_pipe_num_packets_ro
    // CHECK-NEXT: icmp ne i32 [[R]], 0

    if (get_pipe_num_packets(w))
        (void)0;
    // CHECK: [[R:%[0-9]+]] = call i32 @__get_pipe_num_packets_wo
    // CHECK-NEXT: icmp ne i32 [[R]], 0

    if (get_pipe_max_packets(r))
        (void)0;
    // CHECK: [[R:%[0-9]+]] = call i32 @__get_pipe_max_packets_ro
    // CHECK-NEXT: icmp ne i32 [[R]], 0

    if (get_pipe_max_packets(w))
        (void)0;
    // CHECK: [[R:%[0-9]+]] = call i32 @__get_pipe_max_packets_wo
    // CHECK-NEXT: icmp ne i32 [[R]], 0
}

void testBranchingOnAddressSpaceCast(generic long* ptr) {
    // Verify that pointer types are properly casted, respecting address spaces.

    if (to_global(ptr))
        (void)0;
    // CHECK:       [[P:%[0-9]+]] = call [[GLOBAL_VOID:i8 addrspace\(1\)\*]] @__to_global([[GENERIC_VOID:i8 addrspace\(4\)\*]] {{%[0-9]+}})
    // CHECK-NEXT:  [[Q:%[0-9]+]] = bitcast [[GLOBAL_VOID]] [[P]] to [[GLOBAL_i64:i64 addrspace\(1\)\*]]
    // CHECK-NEXT:  [[BOOL:%[a-z0-9]+]] = icmp ne [[GLOBAL_i64]] [[Q]], null
    // CHECK-NEXT:  br i1 [[BOOL]]

    if (to_local(ptr))
        (void)0;
    // CHECK:       [[P:%[0-9]+]] = call [[LOCAL_VOID:i8 addrspace\(3\)\*]] @__to_local([[GENERIC_VOID]] {{%[0-9]+}})
    // CHECK-NEXT:  [[Q:%[0-9]+]] = bitcast [[LOCAL_VOID]] [[P]] to [[LOCAL_i64:i64 addrspace\(3\)\*]]
    // CHECK-NEXT:  [[BOOL:%[a-z0-9]+]] = icmp ne [[LOCAL_i64]] [[Q]], null
    // CHECK-NEXT:  br i1 [[BOOL]]

    if (to_private(ptr))
        (void)0;
    // CHECK:       [[P:%[0-9]+]] = call [[PRIVATE_VOID:i8\*]] @__to_private([[GENERIC_VOID]] {{%[0-9]+}})
    // CHECK-NEXT:  [[Q:%[0-9]+]] = bitcast [[PRIVATE_VOID]] [[P]] to [[PRIVATE_i64:i64\*]]
    // CHECK-NEXT:  [[BOOL:%[a-z0-9]+]] = icmp ne [[PRIVATE_i64]] [[Q]], null
    // CHECK-NEXT:  br i1 [[BOOL]]
}

