[llvm] b6eb6a8 - [FunctionAttrs] Use doesNotCapture()

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 14 06:38:35 PST 2025


Author: Nikita Popov
Date: 2025-01-14T15:36:01+01:00
New Revision: b6eb6a87cf04d8e8e8e323e4d77a38e92a6afc3e

URL: https://github.com/llvm/llvm-project/commit/b6eb6a87cf04d8e8e8e323e4d77a38e92a6afc3e
DIFF: https://github.com/llvm/llvm-project/commit/b6eb6a87cf04d8e8e8e323e4d77a38e92a6afc3e.diff

LOG: [FunctionAttrs] Use doesNotCapture()

To be conservative, explicitly exclude byval arguments, which
doesNotCapture() would otherwise allow. Even if byval has an
initializes attribute, it would only apply to the implicit
copy.

Added: 
    

Modified: 
    llvm/lib/Transforms/IPO/FunctionAttrs.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/IPO/FunctionAttrs.cpp b/llvm/lib/Transforms/IPO/FunctionAttrs.cpp
index 06b5d791abe95e..03cb14c1270c27 100644
--- a/llvm/lib/Transforms/IPO/FunctionAttrs.cpp
+++ b/llvm/lib/Transforms/IPO/FunctionAttrs.cpp
@@ -683,17 +683,17 @@ ArgumentAccessInfo getArgmentAccessInfo(const Instruction *I,
       }
     }
   } else if (auto *CB = dyn_cast<CallBase>(I)) {
-    if (CB->isArgOperand(ArgUse.U)) {
+    if (CB->isArgOperand(ArgUse.U) &&
+        !CB->isByValArgument(CB->getArgOperandNo(ArgUse.U))) {
       unsigned ArgNo = CB->getArgOperandNo(ArgUse.U);
       bool IsInitialize = CB->paramHasAttr(ArgNo, Attribute::Initializes);
-      // Argument is a Write when parameter is writeonly/readnone
-      // and nocapture. Otherwise, it's a WriteWithSideEffect.
-      auto Access = CB->onlyWritesMemory(ArgNo) &&
-                            CB->paramHasAttr(ArgNo, Attribute::NoCapture)
-                        ? ArgumentAccessInfo::AccessType::Write
-                        : ArgumentAccessInfo::AccessType::WriteWithSideEffect;
-      ConstantRangeList AccessRanges;
       if (IsInitialize && ArgUse.Offset) {
+        // Argument is a Write when parameter is writeonly/readnone
+        // and nocapture. Otherwise, it's a WriteWithSideEffect.
+        auto Access = CB->onlyWritesMemory(ArgNo) && CB->doesNotCapture(ArgNo)
+                          ? ArgumentAccessInfo::AccessType::Write
+                          : ArgumentAccessInfo::AccessType::WriteWithSideEffect;
+        ConstantRangeList AccessRanges;
         Attribute Attr = CB->getParamAttr(ArgNo, Attribute::Initializes);
         ConstantRangeList CBCRL = Attr.getValueAsConstantRangeList();
         for (ConstantRange &CR : CBCRL)


        


More information about the llvm-commits mailing list