================ @@ -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); + if (CB.paramHasAttr(I, Attribute::NonNull)) + ValidExactParamAttrs.back().addAttribute(Attribute::NonNull); + if (auto Align = CB.getParamAlign(I)) + ValidExactParamAttrs.back().addAlignmentAttr(Align); + if (auto Range = CB.getParamRange(I)) + ValidExactParamAttrs.back().addRangeAttr(*Range); ---------------- nikic wrote:
Please do something like `for(AttrKind AK : ...) { Attribute Attr = CB.getParamAttr(I, AK); if (Attr.isValid()) ValidExactParamAttrs.back().addAttribute(Attr); }`. We can reuse the original Attributes, no need to reconstruct them. https://github.com/llvm/llvm-project/pull/91101 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits