Skip to content

Commit f155375

Browse files
committed
Address reviewer feedback
1 parent 00b267a commit f155375

File tree

3 files changed

+22
-27
lines changed

3 files changed

+22
-27
lines changed

llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,7 +1028,7 @@ static inline bool isAddLike(const SDValue V) {
10281028
}
10291029

10301030
static SDValue stripAssertAlign(SDValue N) {
1031-
while (N.getOpcode() == ISD::AssertAlign)
1031+
if (N.getOpcode() == ISD::AssertAlign)
10321032
N = N.getOperand(0);
10331033
return N;
10341034
}
@@ -1051,7 +1051,6 @@ static SDValue selectBaseADDR(SDValue N, SelectionDAG *DAG) {
10511051
}
10521052

10531053
static SDValue accumulateOffset(SDValue &Addr, SDLoc DL, SelectionDAG *DAG) {
1054-
Addr = stripAssertAlign(Addr);
10551054
APInt AccumulatedOffset(64u, 0);
10561055
while (isAddLike(Addr)) {
10571056
const auto *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1));
@@ -1063,7 +1062,7 @@ static SDValue accumulateOffset(SDValue &Addr, SDLoc DL, SelectionDAG *DAG) {
10631062
break;
10641063

10651064
AccumulatedOffset += CI;
1066-
Addr = Addr->getOperand(0);
1065+
Addr = stripAssertAlign(Addr->getOperand(0));
10671066
}
10681067
return DAG->getSignedTargetConstant(AccumulatedOffset.getSExtValue(), DL,
10691068
MVT::i32);

llvm/lib/Target/NVPTX/NVPTXLowerArgs.cpp

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
415432
namespace {
416433
struct 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(

llvm/test/CodeGen/NVPTX/lower-args-alignment.ll

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
22
; RUN: opt < %s -passes=nvptx-lower-args,infer-alignment -S | FileCheck %s
33

4-
target datalayout = "e-p:64:64:64-p3:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-i128:128:128-f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-n16:32:64"
54
target triple = "nvptx64-nvidia-cuda"
65

76
; ------------------------------------------------------------------------------

0 commit comments

Comments
 (0)