[clang] [llvm] [Inliner] Propagate more attributes to params when inlining (PR #91101)

via cfe-commits cfe-commits at lists.llvm.org
Fri May 10 22:28:57 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);
----------------
goldsteinn wrote:

Some opposed to this. The current code is a bit verbose, but think that aliasing is typically harder to read/more bug prone. If you feel strongly Ill change though.

https://github.com/llvm/llvm-project/pull/91101


More information about the cfe-commits mailing list