[clang] [llvm] [Inliner] Propagate more attributes to params when inlining (PR #91101)
Nikita Popov via cfe-commits
cfe-commits at lists.llvm.org
Sat Oct 12 11:32:20 PDT 2024
================
@@ -1358,18 +1360,37 @@ 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;
+ // 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.
+ static const Attribute::AttrKind ExactAttrsToPropagate[] = {
+ Attribute::Dereferenceable, Attribute::DereferenceableOrNull,
+ Attribute::NonNull, Attribute::Alignment, Attribute::Range};
+
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();
+
+ for (Attribute::AttrKind AK : ExactAttrsToPropagate) {
+ Attribute Attr = CB.getParamAttr(I, AK);
+ if (Attr.isValid())
+ ValidExactParamAttrs.back().addAttribute(Attr);
+ }
+
+ HasAttrToPropagate |= ValidObjParamAttrs.back().hasAttributes();
----------------
nikic wrote:
This is already done above, drop one of them.
https://github.com/llvm/llvm-project/pull/91101
More information about the cfe-commits
mailing list