From f3139b20a0bf56b3a5e20542363a799619b98ec9 Mon Sep 17 00:00:00 2001 From: Momchil Velikov Date: Mon, 10 May 2021 11:19:13 +0100 Subject: [PATCH] [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 --- llvm/lib/CodeGen/GlobalISel/CallLowering.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp b/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp index 6e2264400791..94b191b6b371 100644 --- a/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp +++ b/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp @@ -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(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));