[clang] [llvm] [Inliner] Propagate more attributes to params when inlining (PR #91101)
Nikita Popov via cfe-commits
cfe-commits at lists.llvm.org
Fri Jul 5 07:17:33 PDT 2024
================
@@ -1352,18 +1352,42 @@ static void AddParamAndFnBasicAttributes(const CallBase &CB,
auto &Context = CalledFunction->getContext();
// Collect valid attributes for all params.
- SmallVector<AttrBuilder> ValidParamAttrs;
+ SmallVector<AttrBuilder> ValidObjParamAttrs, ValidExactParamAttrs;
bool HasAttrToPropagate = false;
for (unsigned I = 0, E = CB.arg_size(); I < E; ++I) {
- ValidParamAttrs.emplace_back(AttrBuilder{CB.getContext()});
+ ValidObjParamAttrs.emplace_back(AttrBuilder{CB.getContext()});
+ ValidExactParamAttrs.emplace_back(AttrBuilder{CB.getContext()});
// Access attributes can be propagated to any param with the same underlying
// object as the argument.
if (CB.paramHasAttr(I, Attribute::ReadNone))
- ValidParamAttrs.back().addAttribute(Attribute::ReadNone);
+ ValidObjParamAttrs.back().addAttribute(Attribute::ReadNone);
if (CB.paramHasAttr(I, Attribute::ReadOnly))
- ValidParamAttrs.back().addAttribute(Attribute::ReadOnly);
- HasAttrToPropagate |= ValidParamAttrs.back().hasAttributes();
+ ValidObjParamAttrs.back().addAttribute(Attribute::ReadOnly);
+ HasAttrToPropagate |= ValidObjParamAttrs.back().hasAttributes();
+
+ // Attributes we can only propagate if the exact parameter is forwarded.
+
+ // We can propagate both poison generating and UB generating attributes
+ // without any extra checks. The only attribute that is tricky to propagate
+ // is `noundef` (skipped for now) as that can create new UB where previous
+ // behavior was just using a poison value.
+ if (auto DerefBytes = CB.getParamDereferenceableBytes(I))
+ ValidExactParamAttrs.back().addDereferenceableAttr(DerefBytes);
+ if (auto DerefOrNullBytes = CB.getParamDereferenceableOrNullBytes(I))
+ ValidExactParamAttrs.back().addDereferenceableOrNullAttr(
+ DerefOrNullBytes);
+ if (CB.paramHasAttr(I, Attribute::NoFree))
+ ValidExactParamAttrs.back().addAttribute(Attribute::NoFree);
----------------
nikic wrote:
Please drop nofree propagation. It's an essentially unused attribute with undecided semantics.
https://github.com/llvm/llvm-project/pull/91101
More information about the cfe-commits
mailing list