[PATCH] D102004: [GlobalISel] Fix wrong invocation of `getParamStackAlign` (NFC)
Momchil Velikov via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu May 6 10:04:12 PDT 2021
chill created this revision.
Herald added subscribers: hiraditya, rovka.
chill requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
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.
https://reviews.llvm.org/D102004
Files:
llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
Index: llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
===================================================================
--- llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
+++ llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
@@ -154,8 +154,9 @@
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 @@
// 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));
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D102004.343443.patch
Type: text/x-patch
Size: 1798 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210506/23802762/attachment.bin>
More information about the llvm-commits
mailing list