forked from OSchip/llvm-project
[NFC] Use ArgListEntry indirect types more in ISel lowering
For opaque pointers, we're trying to avoid uses of PointerType::getElementType(). A couple of ISel places use PointerType::getElementType(). Some of these are easy to fix by using ArgListEntry's indirect types. The inalloca type wasn't stored there, as opposed to preallocated and byval which have their indirect types available, so add it and use it. This is a reland after an MSan fix in D102667. Differential Revision: https://reviews.llvm.org/D101713
This commit is contained in:
parent
1c7f32334d
commit
bc7d15c61d
|
@ -290,8 +290,8 @@ public:
|
|||
bool IsSwiftError : 1;
|
||||
bool IsCFGuardTarget : 1;
|
||||
MaybeAlign Alignment = None;
|
||||
Type *ByValType = nullptr;
|
||||
Type *PreallocatedType = nullptr;
|
||||
// Type for byval, inalloca, or preallocated.
|
||||
Type *IndirectType = nullptr;
|
||||
|
||||
ArgListEntry()
|
||||
: IsSExt(false), IsZExt(false), IsInReg(false), IsSRet(false),
|
||||
|
|
|
@ -1722,14 +1722,17 @@ public:
|
|||
|
||||
/// Extract the byval type for a call or parameter.
|
||||
Type *getParamByValType(unsigned ArgNo) const {
|
||||
Type *Ty = Attrs.getParamByValType(ArgNo);
|
||||
return Ty ? Ty : getArgOperand(ArgNo)->getType()->getPointerElementType();
|
||||
return Attrs.getParamByValType(ArgNo);
|
||||
}
|
||||
|
||||
/// Extract the inalloca type for a call or parameter.
|
||||
Type *getParamInAllocaType(unsigned ArgNo) const {
|
||||
return Attrs.getParamInAllocaType(ArgNo);
|
||||
}
|
||||
|
||||
/// Extract the preallocated type for a call or parameter.
|
||||
Type *getParamPreallocatedType(unsigned ArgNo) const {
|
||||
Type *Ty = Attrs.getParamPreallocatedType(ArgNo);
|
||||
return Ty ? Ty : getArgOperand(ArgNo)->getType()->getPointerElementType();
|
||||
return Attrs.getParamPreallocatedType(ArgNo);
|
||||
}
|
||||
|
||||
/// Extract the number of dereferenceable bytes for a call or
|
||||
|
|
|
@ -1033,7 +1033,7 @@ bool FastISel::lowerCallTo(CallLoweringInfo &CLI) {
|
|||
for (auto &Arg : CLI.getArgs()) {
|
||||
Type *FinalType = Arg.Ty;
|
||||
if (Arg.IsByVal)
|
||||
FinalType = cast<PointerType>(Arg.Ty)->getElementType();
|
||||
FinalType = Arg.IndirectType;
|
||||
bool NeedsRegBlock = TLI.functionArgumentNeedsConsecutiveRegisters(
|
||||
FinalType, CLI.CallConv, CLI.IsVarArg);
|
||||
|
||||
|
@ -1076,10 +1076,10 @@ bool FastISel::lowerCallTo(CallLoweringInfo &CLI) {
|
|||
}
|
||||
MaybeAlign MemAlign = Arg.Alignment;
|
||||
if (Arg.IsByVal || Arg.IsInAlloca || Arg.IsPreallocated) {
|
||||
PointerType *Ty = cast<PointerType>(Arg.Ty);
|
||||
Type *ElementTy = Ty->getElementType();
|
||||
unsigned FrameSize =
|
||||
DL.getTypeAllocSize(Arg.ByValType ? Arg.ByValType : ElementTy);
|
||||
Type *ElementTy = Arg.IndirectType;
|
||||
assert(ElementTy && "Indirect type not set in ArgListEntry");
|
||||
|
||||
unsigned FrameSize = DL.getTypeAllocSize(ElementTy);
|
||||
|
||||
// For ByVal, alignment should come from FE. BE will guess if this info
|
||||
// is not there, but there are cases it cannot get right.
|
||||
|
|
|
@ -9464,7 +9464,7 @@ TargetLowering::LowerCallTo(TargetLowering::CallLoweringInfo &CLI) const {
|
|||
// FIXME: Split arguments if CLI.IsPostTypeLegalization
|
||||
Type *FinalType = Args[i].Ty;
|
||||
if (Args[i].IsByVal)
|
||||
FinalType = cast<PointerType>(Args[i].Ty)->getElementType();
|
||||
FinalType = Args[i].IndirectType;
|
||||
bool NeedsRegBlock = functionArgumentNeedsConsecutiveRegisters(
|
||||
FinalType, CLI.CallConv, CLI.IsVarArg);
|
||||
for (unsigned Value = 0, NumValues = ValueVTs.size(); Value != NumValues;
|
||||
|
@ -9537,11 +9537,10 @@ TargetLowering::LowerCallTo(TargetLowering::CallLoweringInfo &CLI) const {
|
|||
}
|
||||
Align MemAlign;
|
||||
if (Args[i].IsByVal || Args[i].IsInAlloca || Args[i].IsPreallocated) {
|
||||
PointerType *Ty = cast<PointerType>(Args[i].Ty);
|
||||
Type *ElementTy = Ty->getElementType();
|
||||
Type *ElementTy = Args[i].IndirectType;
|
||||
assert(ElementTy && "Indirect type not set in ArgListEntry");
|
||||
|
||||
unsigned FrameSize = DL.getTypeAllocSize(
|
||||
Args[i].ByValType ? Args[i].ByValType : ElementTy);
|
||||
unsigned FrameSize = DL.getTypeAllocSize(ElementTy);
|
||||
Flags.setByValSize(FrameSize);
|
||||
|
||||
// info is not there but there are cases it cannot get right.
|
||||
|
|
|
@ -120,17 +120,26 @@ void TargetLoweringBase::ArgListEntry::setAttributes(const CallBase *Call,
|
|||
Alignment = Attrs.getParamStackAlignment(ArgIdx);
|
||||
|
||||
IsByVal = Attrs.hasParamAttribute(ArgIdx, Attribute::ByVal);
|
||||
ByValType = nullptr;
|
||||
IsInAlloca = Attrs.hasParamAttribute(ArgIdx, Attribute::InAlloca);
|
||||
IsPreallocated = Attrs.hasParamAttribute(ArgIdx, Attribute::Preallocated);
|
||||
|
||||
assert(IsByVal + IsInAlloca + IsPreallocated <= 1 &&
|
||||
"can't have multiple indirect attributes");
|
||||
IndirectType = nullptr;
|
||||
if (IsByVal) {
|
||||
ByValType = Call->getParamByValType(ArgIdx);
|
||||
IndirectType = Call->getParamByValType(ArgIdx);
|
||||
assert(IndirectType && "no byval type?");
|
||||
if (!Alignment)
|
||||
Alignment = Call->getParamAlign(ArgIdx);
|
||||
}
|
||||
IsInAlloca = Attrs.hasParamAttribute(ArgIdx, Attribute::InAlloca);
|
||||
IsPreallocated = Attrs.hasParamAttribute(ArgIdx, Attribute::Preallocated);
|
||||
PreallocatedType = nullptr;
|
||||
if (IsPreallocated)
|
||||
PreallocatedType = Call->getParamPreallocatedType(ArgIdx);
|
||||
if (IsInAlloca) {
|
||||
IndirectType = Call->getParamInAllocaType(ArgIdx);
|
||||
assert(IndirectType && "no inalloca type?");
|
||||
}
|
||||
if (IsPreallocated) {
|
||||
IndirectType = Call->getParamPreallocatedType(ArgIdx);
|
||||
assert(IndirectType && "no preallocated type?");
|
||||
}
|
||||
}
|
||||
|
||||
/// Generate a libcall taking the given operands as arguments and returning a
|
||||
|
|
Loading…
Reference in New Issue