[PATCH] D58719: [PR40778][Sema] Adjust address space of operands in builtin operators

Anastasia Stulova via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Feb 27 08:16:27 PST 2019


Anastasia created this revision.
Anastasia added reviewers: rjmccall, ebevhan.

Adjust address space for references and pointer operands of builtin operators.

Currently this patch only changes addr space for OpenCL in assignment operator, that is needed to fix the bug in the testcase reported in:
https://bugs.llvm.org/show_bug.cgi?id=40778

If general direction is fine I plan to generalize to other operators too.


https://reviews.llvm.org/D58719

Files:
  lib/Sema/SemaOverload.cpp
  test/CodeGenOpenCLCXX/addrspace-operators.cl


Index: test/CodeGenOpenCLCXX/addrspace-operators.cl
===================================================================
--- /dev/null
+++ test/CodeGenOpenCLCXX/addrspace-operators.cl
@@ -0,0 +1,24 @@
+//RUN: %clang_cc1 %s -triple spir -cl-std=c++ -emit-llvm -O0 -o - | FileCheck %s
+
+enum E {
+  a,
+  b,
+};
+
+class C {
+public:
+  void foo(E e) { me = e; }
+  E me;
+};
+
+void bar() {
+  C c;
+  //CHECK: addrspacecast %class.C* %c to %class.C addrspace(4)*
+  //CHECK: call void @_ZNU3AS41C3fooE1E(%class.C addrspace(4)* %{{[0-9]+}}, i32 0)
+  c.foo(a);
+}
+
+//CHECK: define linkonce_odr void @_ZNU3AS41C3fooE1E(%class.C addrspace(4)* %this, i32 %e)
+//CHECK: [[E:%[0-9]+]] = load i32, i32* %e.addr
+//CHECK: %me = getelementptr inbounds %class.C, %class.C addrspace(4)* %this1, i32 0, i32 0
+//CHECK: store i32 [[E]], i32 addrspace(4)* %me
Index: lib/Sema/SemaOverload.cpp
===================================================================
--- lib/Sema/SemaOverload.cpp
+++ lib/Sema/SemaOverload.cpp
@@ -7659,6 +7659,18 @@
     }
   }
 }
+/// Helper function for adjusting address spaces for the pointer or reference
+/// operands of builtin operators
+static QualType AdjustAddressSpaceForBuiltinOperandType(Sema &S, QualType T) {
+  // For OpenCL all builtin operators should use generic addr space on their
+  // pointer or reference operands.
+  if (S.LangOpts.OpenCL) {
+    return S.Context.getAddrSpaceQualType(S.Context.removeAddrSpaceQualType(T),
+                                          LangAS::opencl_generic);
+  }
+  // FIXME: Generalise to C++.
+  return T;
+}
 
 /// Helper function for AddBuiltinOperatorCandidates() that adds
 /// the volatile- and non-volatile-qualified assignment operators for the
@@ -7670,15 +7682,17 @@
   QualType ParamTypes[2];
 
   // T& operator=(T&, T)
-  ParamTypes[0] = S.Context.getLValueReferenceType(T);
+  ParamTypes[0] = S.Context.getLValueReferenceType(
+      AdjustAddressSpaceForBuiltinOperandType(S, T));
   ParamTypes[1] = T;
   S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet,
                         /*IsAssignmentOperator=*/true);
 
   if (!S.Context.getCanonicalType(T).isVolatileQualified()) {
     // volatile T& operator=(volatile T&, T)
-    ParamTypes[0]
-      = S.Context.getLValueReferenceType(S.Context.getVolatileType(T));
+    ParamTypes[0] = S.Context.getLValueReferenceType(
+        AdjustAddressSpaceForBuiltinOperandType(S,
+                                                S.Context.getVolatileType(T)));
     ParamTypes[1] = T;
     S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet,
                           /*IsAssignmentOperator=*/true);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D58719.188544.patch
Type: text/x-patch
Size: 2641 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190227/97280b2b/attachment.bin>


More information about the cfe-commits mailing list