[llvm-dev] Restrict qualifier on class members

Bandhav Veluri via llvm-dev llvm-dev at lists.llvm.org
Sun Jun 21 09:56:36 PDT 2020


Hi,

I'm trying to abstract some special pointers with a class, like in the
example program below:

  1 #define __remote __attribute__((address_space(1)))
  2 #include <stdint.h>
  3
  4 __remote int* A;
  5 __remote int* B;
  6
  7 class RemotePtr {
  8   private:
  9     __remote int* __restrict a;
 10
 11   public:
 12     RemotePtr(__remote int* a) : a(a) {}
 13
 14     __remote int& at(int n) {
 15       return a[n];
 16     }
 17 };
 18
 19 int main(int argc, char** argv) {
 20   RemotePtr a(A);
 21   RemotePtr b(B);
 22
 23   #pragma unroll 4
 24   for(int i=0; i<4; ++i) {
 25     a.at(i) += b.at(i);
 26   }
 27
 28   return 0;
 29 }

It's given that pointer a, in each object of the class RemotePtr, is the
only pointer that can access the array pointed by it. So, I tried __remote
int* __restrict a; (line 9) construct to tell Clang the same. This doesn't
seem to work and I see no noliass in the generated IR. Specifically, I want
lines 23-26 optimized assuming no aliasing between A and B. Any reason why
Clang shouldn't annotate memory accesses in lines 23-26 with noaliass
taking line 9 into account?

The higher level problem is this: is there a way to compile lines 23-26
assuming no aliasing between A and B, by just doing something in the
RemotePtr class (so that main is clear of ugly code)? If that's not
possible, is there a way to tell Clang that lines 23-26 should assume no
aliasing at all, by some pragma?

Thank you,
Bandhav
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200621/7971fe25/attachment.html>


More information about the llvm-dev mailing list