Index: lib/Target/NVPTX/NVPTXAsmPrinter.cpp =================================================================== --- lib/Target/NVPTX/NVPTXAsmPrinter.cpp +++ lib/Target/NVPTX/NVPTXAsmPrinter.cpp @@ -368,13 +368,13 @@ } else if (isa(Ty)) { O << ".param .b" << TLI->getPointerTy(DL).getSizeInBits() << " func_retval0"; - } else if ((Ty->getTypeID() == Type::StructTyID) || isa(Ty)) { + } else if (Ty->isAggregateType() || Ty->isVectorTy()) { unsigned totalsz = DL.getTypeAllocSize(Ty); - unsigned retAlignment = 0; - if (!llvm::getAlign(*F, 0, retAlignment)) - retAlignment = DL.getABITypeAlignment(Ty); - O << ".param .align " << retAlignment << " .b8 func_retval0[" << totalsz - << "]"; + unsigned retAlignment = 0; + if (!llvm::getAlign(*F, 0, retAlignment)) + retAlignment = DL.getABITypeAlignment(Ty); + O << ".param .align " << retAlignment << " .b8 func_retval0[" << totalsz + << "]"; } else llvm_unreachable("Unknown return type"); } else { Index: test/CodeGen/NVPTX/arg-lowering.ll =================================================================== --- test/CodeGen/NVPTX/arg-lowering.ll +++ test/CodeGen/NVPTX/arg-lowering.ll @@ -11,3 +11,9 @@ define <2 x float> @foo1({float, float, i64} %arg0) { ret <2 x float> } + +; CHECK: .visible .func (.param .align 4 .b8 func_retval0[16]) foo2( +; CHECK: .param .align 4 .b8 foo2_param_0[8] +define [4 x float] @foo2({float, float} %arg0) { + ret [4 x float] [float 1.0, float 1.0, float 1.0, float 1.0] +}