diff options
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/CodeGenOpenCL/address-spaces-conversions.cl | 39 | ||||
-rw-r--r-- | clang/test/SemaOpenCL/address-spaces-conversions-cl2.0.cl | 66 |
2 files changed, 105 insertions, 0 deletions
diff --git a/clang/test/CodeGenOpenCL/address-spaces-conversions.cl b/clang/test/CodeGenOpenCL/address-spaces-conversions.cl index a306e0045f4..bcd0267e8be 100644 --- a/clang/test/CodeGenOpenCL/address-spaces-conversions.cl +++ b/clang/test/CodeGenOpenCL/address-spaces-conversions.cl @@ -5,6 +5,7 @@ // test that we generate address space casts everywhere we need conversions of // pointers to different address spaces +// CHECK: define void @test void test(global int *arg_glob, generic int *arg_gen) { int var_priv; arg_gen = arg_glob; // implicit cast global -> generic @@ -39,3 +40,41 @@ void test(global int *arg_glob, generic int *arg_gen) { // CHECK-NOFAKE: bitcast // CHECK-NOFAKE-NOT: addrspacecast } + +// Test ternary operator. +// CHECK: define void @test_ternary +void test_ternary(void) { + global int *var_glob; + generic int *var_gen; + generic int *var_gen2; + generic float *var_gen_f; + generic void *var_gen_v; + + var_gen = var_gen ? var_gen : var_gen2; // operands of the same addr spaces and the same type + // CHECK: icmp + // CHECK-NOT: addrspacecast + // CHECK-NOT: bitcast + // CHECK: phi + // CHECK: store i32 addrspace(4)* %{{.+}}, i32 addrspace(4)** %{{.+}} + + var_gen = var_gen ? var_gen : var_glob; // operands of overlapping addr spaces and the same type + // CHECK: icmp + // CHECK-NOT: bitcast + // CHECK: %{{.+}} = addrspacecast i32 addrspace(1)* %{{.+}} to i32 addrspace(4)* + // CHECK: phi + // CHECK: store + + var_gen_v = var_gen ? var_gen : var_gen_f; // operands of the same addr space and different types + // CHECK: icmp + // CHECK: %{{.+}} = bitcast i32 addrspace(4)* %{{.+}} to i8 addrspace(4)* + // CHECK: %{{.+}} = bitcast float addrspace(4)* %{{.+}} to i8 addrspace(4)* + // CHECK: phi + // CHECK: store + + var_gen_v = var_gen ? var_glob : var_gen_f; // operands of overlapping addr spaces and different types + // CHECK: icmp + // CHECK: %{{.+}} = addrspacecast i32 addrspace(1)* %{{.+}} to i8 addrspace(4)* + // CHECK: %{{.+}} = bitcast float addrspace(4)* %{{.+}} to i8 addrspace(4)* + // CHECK: phi + // CHECK: store +} diff --git a/clang/test/SemaOpenCL/address-spaces-conversions-cl2.0.cl b/clang/test/SemaOpenCL/address-spaces-conversions-cl2.0.cl index 50363f23a90..97fd07a24a2 100644 --- a/clang/test/SemaOpenCL/address-spaces-conversions-cl2.0.cl +++ b/clang/test/SemaOpenCL/address-spaces-conversions-cl2.0.cl @@ -225,3 +225,69 @@ void test_conversion(global int *arg_glob, local int *arg_loc, // expected-error@-2{{passing '__constant int *' to parameter of type '__generic int *' changes address space of pointer}} #endif } + +void test_ternary() { + AS int *var_cond; + generic int *var_gen; + global int *var_glob; + var_gen = 0 ? var_cond : var_glob; +#ifdef CONSTANT +// expected-error@-2{{conditional operator with the second and third operands of type ('__constant int *' and '__global int *') which are pointers to non-overlapping address spaces}} +#endif + + local int *var_loc; + var_gen = 0 ? var_cond : var_loc; +#ifndef GENERIC +// expected-error-re@-2{{conditional operator with the second and third operands of type ('__{{global|constant}} int *' and '__local int *') which are pointers to non-overlapping address spaces}} +#endif + + constant int *var_const; + var_cond = 0 ? var_cond : var_const; +#ifndef CONSTANT +// expected-error-re@-2{{conditional operator with the second and third operands of type ('__{{global|generic}} int *' and '__constant int *') which are pointers to non-overlapping address spaces}} +#endif + + private int *var_priv; + var_gen = 0 ? var_cond : var_priv; +#ifndef GENERIC +// expected-error-re@-2{{conditional operator with the second and third operands of type ('__{{global|constant}} int *' and 'int *') which are pointers to non-overlapping address spaces}} +#endif + + var_gen = 0 ? var_cond : var_gen; +#ifdef CONSTANT +// expected-error@-2{{conditional operator with the second and third operands of type ('__constant int *' and '__generic int *') which are pointers to non-overlapping address spaces}} +#endif + + void *var_void_gen; + global char *var_glob_ch; + var_void_gen = 0 ? var_cond : var_glob_ch; +#ifdef CONSTANT +// expected-error@-2{{conditional operator with the second and third operands of type ('__constant int *' and '__global char *') which are pointers to non-overlapping address spaces}} +#endif + + local char *var_loc_ch; + var_void_gen = 0 ? var_cond : var_loc_ch; +#ifndef GENERIC +// expected-error-re@-2{{conditional operator with the second and third operands of type ('__{{global|constant}} int *' and '__local char *') which are pointers to non-overlapping address spaces}} +#endif + + constant void *var_void_const; + constant char *var_const_ch; + var_void_const = 0 ? var_cond : var_const_ch; +#ifndef CONSTANT +// expected-error-re@-2{{conditional operator with the second and third operands of type ('__{{global|generic}} int *' and '__constant char *') which are pointers to non-overlapping address spaces}} +#endif + + private char *var_priv_ch; + var_void_gen = 0 ? var_cond : var_priv_ch; +#ifndef GENERIC +// expected-error-re@-2{{conditional operator with the second and third operands of type ('__{{global|constant}} int *' and 'char *') which are pointers to non-overlapping address spaces}} +#endif + + generic char *var_gen_ch; + var_void_gen = 0 ? var_cond : var_gen_ch; +#ifdef CONSTANT +// expected-error@-2{{conditional operator with the second and third operands of type ('__constant int *' and '__generic char *') which are pointers to non-overlapping address spaces}} +#endif +} + |