}
}
-static unsigned int getOpenCLAlignment(const DataLayout &DL, Type *Ty) {
- if (Ty->isSingleValueType())
- return DL.getPrefTypeAlignment(Ty);
-
- auto *ATy = dyn_cast<ArrayType>(Ty);
- if (ATy)
- return getOpenCLAlignment(DL, ATy->getElementType());
-
- auto *STy = dyn_cast<StructType>(Ty);
- if (STy) {
- unsigned int alignStruct = 1;
- // Go through each element of the struct and find the
- // largest alignment.
- for (unsigned i = 0, e = STy->getNumElements(); i != e; i++) {
- Type *ETy = STy->getElementType(i);
- unsigned int align = getOpenCLAlignment(DL, ETy);
- if (align > alignStruct)
- alignStruct = align;
- }
- return alignStruct;
- }
-
- auto *FTy = dyn_cast<FunctionType>(Ty);
- if (FTy)
- return DL.getPointerPrefAlignment().value();
- return DL.getPrefTypeAlignment(Ty);
-}
-
void NVPTXAsmPrinter::printParamName(Function::const_arg_iterator I,
int paramIndex, raw_ostream &O) {
getSymbol(I->getParent())->print(O, MAI);
if (static_cast<NVPTXTargetMachine &>(TM).getDrvInterface() !=
NVPTX::CUDA) {
- Type *ETy = PTy->getPointerElementType();
int addrSpace = PTy->getAddressSpace();
switch (addrSpace) {
default:
O << ".ptr .global ";
break;
}
- O << ".align " << (int)getOpenCLAlignment(DL, ETy) << " ";
+ Align ParamAlign = I->getParamAlign().valueOrOne();
+ O << ".align " << ParamAlign.value() << " ";
}
printParamName(I, paramIndex, O);
continue;
target triple = "nvptx-unknown-nvcl"
+define void @foo(i64 %img, i64 %sampler, <5 x float>* align 32 %v1, i32* %v2) {
+; The parameter alignment is determined by the align attribute (default 1).
; CHECK-LABEL: .entry foo(
-define void @foo(i64 %img, i64 %sampler, <5 x float>* %v) {
-; The parameter alignment should be the next power of 2 of 5xsizeof(float),
-; which is 32.
; CHECK: .param .u32 .ptr .align 32 foo_param_2
+; CHECK: .param .u32 .ptr .align 1 foo_param_3
ret void
}
!nvvm.annotations = !{!1, !2, !3}
-!1 = !{void (i64, i64, <5 x float>*)* @foo, !"kernel", i32 1}
-!2 = !{void (i64, i64, <5 x float>*)* @foo, !"rdoimage", i32 0}
-!3 = !{void (i64, i64, <5 x float>*)* @foo, !"sampler", i32 1}
+!1 = !{void (i64, i64, <5 x float>*, i32*)* @foo, !"kernel", i32 1}
+!2 = !{void (i64, i64, <5 x float>*, i32*)* @foo, !"rdoimage", i32 0}
+!3 = !{void (i64, i64, <5 x float>*, i32*)* @foo, !"sampler", i32 1}