forked from OSchip/llvm-project
[GlobalISel] Fix wrong invocation of `getParamStackAlign` (NFC)
The function template `CallLowering::setArgFlags` is invoked both for arguments and return values. In the latter case, it calls `getParamStackAlign` with argument index `~0u`. Nothing wrong happens now, as the argument is safely incremented back to 0 inside `getParamStackAlign` (the type is `unsigned`), but in principle it's fragile and may become incorrect. Differential Revision: https://reviews.llvm.org/D102004
This commit is contained in:
parent
407a33889d
commit
f3139b20a0
|
@ -154,8 +154,9 @@ void CallLowering::setArgFlags(CallLowering::ArgInfo &Arg, unsigned OpIdx,
|
|||
const AttributeList &Attrs = FuncInfo.getAttributes();
|
||||
addArgFlagsFromAttributes(Flags, Attrs, OpIdx);
|
||||
|
||||
Align MemAlign;
|
||||
Align MemAlign = DL.getABITypeAlign(Arg.Ty);
|
||||
if (Flags.isByVal() || Flags.isInAlloca() || Flags.isPreallocated()) {
|
||||
assert(OpIdx >= AttributeList::FirstArgIndex);
|
||||
Type *ElementTy = cast<PointerType>(Arg.Ty)->getElementType();
|
||||
|
||||
auto Ty = Attrs.getAttribute(OpIdx, Attribute::ByVal).getValueAsType();
|
||||
|
@ -163,16 +164,18 @@ void CallLowering::setArgFlags(CallLowering::ArgInfo &Arg, unsigned OpIdx,
|
|||
|
||||
// For ByVal, alignment should be passed from FE. BE will guess if
|
||||
// this info is not there but there are cases it cannot get right.
|
||||
if (auto ParamAlign = FuncInfo.getParamStackAlign(OpIdx - 1))
|
||||
if (auto ParamAlign =
|
||||
FuncInfo.getParamStackAlign(OpIdx - AttributeList::FirstArgIndex))
|
||||
MemAlign = *ParamAlign;
|
||||
else if ((ParamAlign = FuncInfo.getParamAlign(OpIdx - 1)))
|
||||
else if ((ParamAlign =
|
||||
FuncInfo.getParamAlign(OpIdx - AttributeList::FirstArgIndex)))
|
||||
MemAlign = *ParamAlign;
|
||||
else
|
||||
MemAlign = Align(getTLI()->getByValTypeAlignment(ElementTy, DL));
|
||||
} else if (auto ParamAlign = FuncInfo.getParamStackAlign(OpIdx - 1)) {
|
||||
MemAlign = *ParamAlign;
|
||||
} else {
|
||||
MemAlign = Align(DL.getABITypeAlign(Arg.Ty));
|
||||
} else if (OpIdx >= AttributeList::FirstArgIndex) {
|
||||
if (auto ParamAlign =
|
||||
FuncInfo.getParamStackAlign(OpIdx - AttributeList::FirstArgIndex))
|
||||
MemAlign = *ParamAlign;
|
||||
}
|
||||
Flags.setMemAlign(MemAlign);
|
||||
Flags.setOrigAlign(DL.getABITypeAlign(Arg.Ty));
|
||||
|
|
Loading…
Reference in New Issue