@@ -412,6 +412,23 @@ static void adjustByValArgAlignment(Argument *Arg, Value *ArgInParamAS,
412412 }
413413}
414414
415+ // Create a call to the nvvm_internal_addrspace_wrap intrinsic and set the
416+ // alignment of the return value based on the alignment of the argument.
417+ static CallInst *createNVVMInternalAddrspaceWrap (IRBuilder<> &IRB,
418+ Argument &Arg,
419+ const Twine &Name = " " ) {
420+ CallInst *ArgInParam =
421+ IRB.CreateIntrinsic (Intrinsic::nvvm_internal_addrspace_wrap,
422+ {IRB.getPtrTy (ADDRESS_SPACE_PARAM), Arg.getType ()},
423+ &Arg, {}, Name);
424+
425+ if (MaybeAlign ParamAlign = Arg.getParamAlign ())
426+ ArgInParam->addRetAttr (
427+ Attribute::getWithAlignment (ArgInParam->getContext (), *ParamAlign));
428+
429+ return ArgInParam;
430+ }
431+
415432namespace {
416433struct ArgUseChecker : PtrUseVisitor<ArgUseChecker> {
417434 using Base = PtrUseVisitor<ArgUseChecker>;
@@ -515,14 +532,7 @@ void copyByValParam(Function &F, Argument &Arg) {
515532 Arg.getParamAlign ().value_or (DL.getPrefTypeAlign (StructType)));
516533 Arg.replaceAllUsesWith (AllocA);
517534
518- CallInst *ArgInParam =
519- IRB.CreateIntrinsic (Intrinsic::nvvm_internal_addrspace_wrap,
520- {IRB.getPtrTy (ADDRESS_SPACE_PARAM), Arg.getType ()},
521- &Arg, {}, Arg.getName ());
522-
523- if (MaybeAlign ParamAlign = Arg.getParamAlign ())
524- ArgInParam->addRetAttr (
525- Attribute::getWithAlignment (ArgInParam->getContext (), *ParamAlign));
535+ CallInst *ArgInParam = createNVVMInternalAddrspaceWrap (IRB, Arg, Arg.getName ());
526536
527537 // Be sure to propagate alignment to this load; LLVM doesn't know that NVPTX
528538 // addrspacecast preserves alignment. Since params are constant, this load
@@ -553,13 +563,7 @@ static void handleByValParam(const NVPTXTargetMachine &TM, Argument *Arg) {
553563 SmallVector<Use *, 16 > UsesToUpdate (llvm::make_pointer_range (Arg->uses ()));
554564
555565 IRBuilder<> IRB (&*FirstInst);
556- CallInst *ArgInParamAS = IRB.CreateIntrinsic (
557- Intrinsic::nvvm_internal_addrspace_wrap,
558- {IRB.getPtrTy (ADDRESS_SPACE_PARAM), Arg->getType ()}, {Arg});
559-
560- if (MaybeAlign ParamAlign = Arg->getParamAlign ())
561- ArgInParamAS->addRetAttr (
562- Attribute::getWithAlignment (ArgInParamAS->getContext (), *ParamAlign));
566+ CallInst *ArgInParamAS = createNVVMInternalAddrspaceWrap (IRB, *Arg);
563567
564568 for (Use *U : UsesToUpdate)
565569 convertToParamAS (U, ArgInParamAS, HasCvtaParam, IsGridConstant);
@@ -589,14 +593,7 @@ static void handleByValParam(const NVPTXTargetMachine &TM, Argument *Arg) {
589593 // argument already in the param address space, we need to use the noop
590594 // intrinsic, this had the added benefit of preventing other optimizations
591595 // from folding away this pair of addrspacecasts.
592- auto *ParamSpaceArg =
593- IRB.CreateIntrinsic (Intrinsic::nvvm_internal_addrspace_wrap,
594- {IRB.getPtrTy (ADDRESS_SPACE_PARAM), Arg->getType ()},
595- Arg, {}, Arg->getName () + " .param" );
596-
597- if (MaybeAlign ParamAlign = Arg->getParamAlign ())
598- ParamSpaceArg->addRetAttr (Attribute::getWithAlignment (
599- ParamSpaceArg->getContext (), *ParamAlign));
596+ auto *ParamSpaceArg = createNVVMInternalAddrspaceWrap (IRB, *Arg, Arg->getName () + " .param" );
600597
601598 // Cast param address to generic address space.
602599 Value *GenericArg = IRB.CreateAddrSpaceCast (
0 commit comments