aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/IPO/FunctionAttrs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Transforms/IPO/FunctionAttrs.cpp')
-rw-r--r--llvm/lib/Transforms/IPO/FunctionAttrs.cpp16
1 files changed, 8 insertions, 8 deletions
diff --git a/llvm/lib/Transforms/IPO/FunctionAttrs.cpp b/llvm/lib/Transforms/IPO/FunctionAttrs.cpp
index 06b5d79..03cb14c 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)