summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorYaxun Liu <Yaxun.Liu@amd.com>2016-04-28 17:34:57 +0000
committerYaxun Liu <Yaxun.Liu@amd.com>2016-04-28 17:34:57 +0000
commitab93394a29672c1f2daff7b920c203f8db6a5953 (patch)
treeca02780eefcdbeee9ee14160c24c8d73e845fbef /clang
parent08afb05491aa7dd63cf14ba76261dff0203ee686 (diff)
downloadbcm5719-llvm-ab93394a29672c1f2daff7b920c203f8db6a5953.tar.gz
bcm5719-llvm-ab93394a29672c1f2daff7b920c203f8db6a5953.zip
[OpenCL] Fix bug in mergeTypes which causes equivalent types treated as different.
When comparing unqualified types, canonical types should be used, otherwise equivalent types may be treated as different type. Differential Revision: http://reviews.llvm.org/D19662 llvm-svn: 267906
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/AST/ASTContext.cpp2
-rw-r--r--clang/test/CodeGenOpenCL/address-spaces-conversions.cl11
2 files changed, 11 insertions, 2 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index fb4c80bd7fd..4f7f8ee8b8d 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -7618,7 +7618,7 @@ QualType ASTContext::mergeTypes(QualType LHS, QualType RHS,
Qualifiers RQuals = RHSCan.getLocalQualifiers();
if (LQuals != RQuals) {
if (getLangOpts().OpenCL) {
- if (LHS.getUnqualifiedType() != RHS.getUnqualifiedType() ||
+ if (LHSCan.getUnqualifiedType() != RHSCan.getUnqualifiedType() ||
LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers())
return QualType();
if (LQuals.isAddressSpaceSupersetOf(RQuals))
diff --git a/clang/test/CodeGenOpenCL/address-spaces-conversions.cl b/clang/test/CodeGenOpenCL/address-spaces-conversions.cl
index bcd0267e8be..c947db41e07 100644
--- a/clang/test/CodeGenOpenCL/address-spaces-conversions.cl
+++ b/clang/test/CodeGenOpenCL/address-spaces-conversions.cl
@@ -63,7 +63,16 @@ void test_ternary(void) {
// CHECK: %{{.+}} = addrspacecast i32 addrspace(1)* %{{.+}} to i32 addrspace(4)*
// CHECK: phi
// CHECK: store
-
+
+ typedef int int_t;
+ global int_t *var_glob_typedef;
+ var_gen = var_gen ? var_gen : var_glob_typedef; // operands of overlapping addr spaces and equivalent types
+ // 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)*
OpenPOWER on IntegriCloud