OpenCL 2.0支持generic address space,所以在定义一个函数的时候可以不指定指针的地址空间,那么在调用该函数的时候可以传入任何地址空间的指针,所以函数内部不知道怎么翻译有关该指针的访存指令。可以看下面这个例子:
// RUN: clang -cl-std=CL2.0 -target riscv32 -mcpu=ventus-gpgpu -S %s
int test2(private int *a) {
return *a + 1;
}
int test3(int *a) {
return *a + 1;
}
int test1() {
private int a[2];
return test2(a) + test3(a);
}
test2:
addi sp, sp, 4
sw ra, -4(sp)
vlw.v v0, 0(v0)
vadd.vi v0, v0, 1
lw ra, -4(sp)
addi sp, sp, -4
ret
.Lfunc_end0:
.size test2, .Lfunc_end0-test2
.globl test3
.p2align 2
.type test3,@function
test3:
addi sp, sp, 4
sw ra, -4(sp)
vlw12.v v0, 0(v0)
vadd.vi v0, v0, 1
lw ra, -4(sp)
addi sp, sp, -4
ret
.Lfunc_end1:
.size test3, .Lfunc_end1-test3
.globl test1
.p2align 2
.type test1,@function
test1:
addi sp, sp, 4
sw ra, -4(sp)
lw ra, -4(sp)
addi sp, sp, -4
ret
OpenCL 2.0支持generic address space,所以在定义一个函数的时候可以不指定指针的地址空间,那么在调用该函数的时候可以传入任何地址空间的指针,所以函数内部不知道怎么翻译有关该指针的访存指令。可以看下面这个例子:
这里test3和test2翻成了不同的访存指令。下面是汇编: