[llvm] c0281c7 - [OpaquePtr][SPARC] Remove getPointerElementType() call in SparcISelLowering
Arthur Eubanks via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 11 11:31:53 PST 2022
Author: Arthur Eubanks
Date: 2022-02-11T11:31:19-08:00
New Revision: c0281c7607b1a8c060f3aeba4bbfc07b54f54832
URL: https://github.com/llvm/llvm-project/commit/c0281c7607b1a8c060f3aeba4bbfc07b54f54832
DIFF: https://github.com/llvm/llvm-project/commit/c0281c7607b1a8c060f3aeba4bbfc07b54f54832.diff
LOG: [OpaquePtr][SPARC] Remove getPointerElementType() call in SparcISelLowering
Requires keeping better track of sret types.
Added:
Modified:
llvm/include/llvm/IR/InstrTypes.h
llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
llvm/lib/Target/Sparc/SparcISelLowering.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/IR/InstrTypes.h b/llvm/include/llvm/IR/InstrTypes.h
index 589926c0faf1f..3f53f56721715 100644
--- a/llvm/include/llvm/IR/InstrTypes.h
+++ b/llvm/include/llvm/IR/InstrTypes.h
@@ -1761,7 +1761,7 @@ class CallBase : public Instruction {
return nullptr;
}
- /// Extract the preallocated type for a call or parameter.
+ /// Extract the inalloca type for a call or parameter.
Type *getParamInAllocaType(unsigned ArgNo) const {
if (auto *Ty = Attrs.getParamInAllocaType(ArgNo))
return Ty;
@@ -1770,6 +1770,15 @@ class CallBase : public Instruction {
return nullptr;
}
+ /// Extract the sret type for a call or parameter.
+ Type *getParamStructRetType(unsigned ArgNo) const {
+ if (auto *Ty = Attrs.getParamStructRetType(ArgNo))
+ return Ty;
+ if (const Function *F = getCalledFunction())
+ return F->getAttributes().getParamStructRetType(ArgNo);
+ return nullptr;
+ }
+
/// Extract the number of dereferenceable bytes for a call or
/// parameter (0=unknown).
uint64_t getRetDereferenceableBytes() const {
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index 72f14b4568829..51f758650d87c 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -121,7 +121,7 @@ void TargetLoweringBase::ArgListEntry::setAttributes(const CallBase *Call,
IsSwiftError = Call->paramHasAttr(ArgIdx, Attribute::SwiftError);
Alignment = Call->getParamStackAlign(ArgIdx);
IndirectType = nullptr;
- assert(IsByVal + IsPreallocated + IsInAlloca <= 1 &&
+ assert(IsByVal + IsPreallocated + IsInAlloca + IsSRet <= 1 &&
"multiple ABI attributes?");
if (IsByVal) {
IndirectType = Call->getParamByValType(ArgIdx);
@@ -132,6 +132,8 @@ void TargetLoweringBase::ArgListEntry::setAttributes(const CallBase *Call,
IndirectType = Call->getParamPreallocatedType(ArgIdx);
if (IsInAlloca)
IndirectType = Call->getParamInAllocaType(ArgIdx);
+ if (IsSRet)
+ IndirectType = Call->getParamStructRetType(ArgIdx);
}
/// Generate a libcall taking the given operands as arguments and returning a
diff --git a/llvm/lib/Target/Sparc/SparcISelLowering.cpp b/llvm/lib/Target/Sparc/SparcISelLowering.cpp
index 6d6879bc94b38..501bb4d4910f6 100644
--- a/llvm/lib/Target/Sparc/SparcISelLowering.cpp
+++ b/llvm/lib/Target/Sparc/SparcISelLowering.cpp
@@ -825,9 +825,8 @@ SparcTargetLowering::LowerCall_32(TargetLowering::CallLoweringInfo &CLI,
hasStructRetAttr = true;
// sret only allowed on first argument
assert(Outs[realArgIdx].OrigArgIndex == 0);
- PointerType *Ty = cast<PointerType>(CLI.getArgs()[0].Ty);
- Type *ElementTy = Ty->getPointerElementType();
- SRetArgSize = DAG.getDataLayout().getTypeAllocSize(ElementTy);
+ SRetArgSize =
+ DAG.getDataLayout().getTypeAllocSize(CLI.getArgs()[0].IndirectType);
continue;
}
@@ -2178,8 +2177,10 @@ SparcTargetLowering::LowerF128Op(SDValue Op, SelectionDAG &DAG,
RetPtr = DAG.getFrameIndex(RetFI, PtrVT);
Entry.Node = RetPtr;
Entry.Ty = PointerType::getUnqual(RetTy);
- if (!Subtarget->is64Bit())
+ if (!Subtarget->is64Bit()) {
Entry.IsSRet = true;
+ Entry.IndirectType = RetTy;
+ }
Entry.IsReturned = false;
Args.push_back(Entry);
RetTyABI = Type::getVoidTy(*DAG.getContext());
More information about the llvm-commits
mailing list