diff options
author | Yaxun Liu <Yaxun.Liu@amd.com> | 2016-04-12 19:43:36 +0000 |
---|---|---|
committer | Yaxun Liu <Yaxun.Liu@amd.com> | 2016-04-12 19:43:36 +0000 |
commit | a1a87adf59f880f6ab64a160bd521efeb3ae2e54 (patch) | |
tree | 1efb54acb5372c485f92f88479d6d7c6ecd80080 /clang/test/CodeGenOpenCL/address-spaces-conversions.cl | |
parent | 49bd58f1ebe28d97e4949e9c757bc5dfd8b2d72f (diff) | |
download | bcm5719-llvm-a1a87adf59f880f6ab64a160bd521efeb3ae2e54.tar.gz bcm5719-llvm-a1a87adf59f880f6ab64a160bd521efeb3ae2e54.zip |
PR19957: [OpenCL] Incorrectly accepts implicit address space conversion with ternary operator.
Generates addrspacecast instead of bitcast for ternary operator when necessary, and diagnose ternary operator with incompatible second and third operands.
https://llvm.org/bugs/show_bug.cgi?id=19957
Differential Revision: http://reviews.llvm.org/D17412
llvm-svn: 266111
Diffstat (limited to 'clang/test/CodeGenOpenCL/address-spaces-conversions.cl')
-rw-r--r-- | clang/test/CodeGenOpenCL/address-spaces-conversions.cl | 39 |
1 files changed, 39 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 +} |