[clang] [llvm] [Inliner] Propagate more attributes to params when inlining (PR #91101)
Yingwei Zheng via cfe-commits
cfe-commits at lists.llvm.org
Fri May 10 17:41:37 PDT 2024
================
@@ -1352,20 +1352,43 @@ 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);
+ ValidObjParamAttrs.back().addAttribute(Attribute::ReadOnly);
if (CB.paramHasAttr(I, Attribute::WriteOnly))
- ValidParamAttrs.back().addAttribute(Attribute::WriteOnly);
- HasAttrToPropagate |= ValidParamAttrs.back().hasAttributes();
+ ValidObjParamAttrs.back().addAttribute(Attribute::WriteOnly);
+
+ // Attributes we can only propagate if the exact parameter is forwarded.
+
+ // We can propagate both poison generating an 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);
----------------
dtcxzyw wrote:
```suggestion
auto &ExactAttr = ValidExactParamAttrs.back();
if (auto DerefBytes = CB.getParamDereferenceableBytes(I))
ExactAttr.addDereferenceableAttr(DerefBytes);
```
https://github.com/llvm/llvm-project/pull/91101
More information about the cfe-commits
mailing list