yaxunl added a comment.

In D55067#1313213 <https://reviews.llvm.org/D55067#1313213>, @rjmccall wrote:

> This seems backwards.  Clang knows what the actual ABI alignment of the C 
> type is, and it doesn't have to match the alignment of the IR type that IRGen 
> produces.  It's the actual C ABI alignment that's supposed to affect the 
> calling convention, so there needs to be some way to specify the C ABI 
> alignment on the parameter in IR.  That may mean using `byval`, which can be 
> given an explicit alignment.


Also, the alignment of the kernel argument is only used to put the argument in 
some buffer accessible to the device. It needs not match the C ABI alignment. 
If the user take address of this argument, they will get address of an alloca, 
which matches the C ABI alignment.

For example, in code below, %s.coerce is OK to align to 1. If user takes its 
address, they get %s, which is aligned to 8.

  %struct.S = type <{ i32*, i8, %struct.U, [5 x i8] }>
  %struct.U = type { i16 }
  
  ; Function Attrs: convergent noinline nounwind optnone
  define amdgpu_kernel void @_Z6kernelc1SPi(i8 %a, %struct.S %s.coerce, i32* 
%b) #0 {
  entry:
    %s = alloca %struct.S, align 8, addrspace(5)
    %s1 = addrspacecast %struct.S addrspace(5)* %s to %struct.S*
    %a.addr = alloca i8, align 1, addrspace(5)
    %0 = addrspacecast i8 addrspace(5)* %a.addr to i8*
    %b.addr = alloca i32*, align 8, addrspace(5)
    %1 = addrspacecast i32* addrspace(5)* %b.addr to i32**
    store %struct.S %s.coerce, %struct.S* %s1, align 8
    store i8 %a, i8* %0, align 1
    store i32* %b, i32** %1, align 8
    ret void
  }


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D55067/new/

https://reviews.llvm.org/D55067



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to