aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/StackSafetyAnalysis.cpp
diff options
context:
space:
mode:
authorEvgenii Stepanov <eugenis@google.com>2020-01-24 16:36:13 -0800
committerEvgenii Stepanov <eugenis@google.com>2020-01-27 15:22:59 -0800
commitc3b80adceef7258bf8b174f104859626a85d59dd (patch)
tree619f754812c885f01dd4b4a6fd40514edb4586d3 /llvm/lib/Analysis/StackSafetyAnalysis.cpp
parent8e3f59b45ae185cc9b4e3a817d7ac958f1d55976 (diff)
downloadllvm-c3b80adceef7258bf8b174f104859626a85d59dd.zip
llvm-c3b80adceef7258bf8b174f104859626a85d59dd.tar.gz
llvm-c3b80adceef7258bf8b174f104859626a85d59dd.tar.bz2
Fix StackSafetyAnalysis crash with scalable vector types.
Summary: Treat scalable allocas as if they have storage size of 0, and scalable-typed memory accesses as if their range is unlimited. This is not a proper support of scalable vector types in the analysis - we can do better, but not today. Reviewers: vitalybuka Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D73394
Diffstat (limited to 'llvm/lib/Analysis/StackSafetyAnalysis.cpp')
-rw-r--r--llvm/lib/Analysis/StackSafetyAnalysis.cpp28
1 files changed, 21 insertions, 7 deletions
diff --git a/llvm/lib/Analysis/StackSafetyAnalysis.cpp b/llvm/lib/Analysis/StackSafetyAnalysis.cpp
index 7f5beda..d85da765 100644
--- a/llvm/lib/Analysis/StackSafetyAnalysis.cpp
+++ b/llvm/lib/Analysis/StackSafetyAnalysis.cpp
@@ -131,7 +131,10 @@ raw_ostream &operator<<(raw_ostream &OS, const ParamInfo &P) {
/// size can not be statically determined.
uint64_t getStaticAllocaAllocationSize(const AllocaInst *AI) {
const DataLayout &DL = AI->getModule()->getDataLayout();
- uint64_t Size = DL.getTypeAllocSize(AI->getAllocatedType());
+ TypeSize TS = DL.getTypeAllocSize(AI->getAllocatedType());
+ if (TS.isScalable())
+ return 0;
+ uint64_t Size = TS.getFixedSize();
if (AI->isArrayAllocation()) {
auto C = dyn_cast<ConstantInt>(AI->getArraySize());
if (!C)
@@ -211,7 +214,9 @@ class StackSafetyLocalAnalysis {
ConstantRange offsetFromAlloca(Value *Addr, const Value *AllocaPtr);
ConstantRange getAccessRange(Value *Addr, const Value *AllocaPtr,
- uint64_t AccessSize);
+ ConstantRange SizeRange);
+ ConstantRange getAccessRange(Value *Addr, const Value *AllocaPtr,
+ TypeSize Size);
ConstantRange getMemIntrinsicAccessRange(const MemIntrinsic *MI, const Use &U,
const Value *AllocaPtr);
@@ -244,9 +249,9 @@ StackSafetyLocalAnalysis::offsetFromAlloca(Value *Addr,
return Offset;
}
-ConstantRange StackSafetyLocalAnalysis::getAccessRange(Value *Addr,
- const Value *AllocaPtr,
- uint64_t AccessSize) {
+ConstantRange
+StackSafetyLocalAnalysis::getAccessRange(Value *Addr, const Value *AllocaPtr,
+ ConstantRange SizeRange) {
if (!SE.isSCEVable(Addr->getType()))
return UnknownRange;
@@ -255,12 +260,20 @@ ConstantRange StackSafetyLocalAnalysis::getAccessRange(Value *Addr,
ConstantRange AccessStartRange =
SE.getUnsignedRange(Expr).zextOrTrunc(PointerSize);
- ConstantRange SizeRange = getRange(0, AccessSize);
ConstantRange AccessRange = AccessStartRange.add(SizeRange);
assert(!AccessRange.isEmptySet());
return AccessRange;
}
+ConstantRange StackSafetyLocalAnalysis::getAccessRange(Value *Addr,
+ const Value *AllocaPtr,
+ TypeSize Size) {
+ ConstantRange SizeRange = Size.isScalable()
+ ? ConstantRange::getFull(PointerSize)
+ : getRange(0, Size.getFixedSize());
+ return getAccessRange(Addr, AllocaPtr, SizeRange);
+}
+
ConstantRange StackSafetyLocalAnalysis::getMemIntrinsicAccessRange(
const MemIntrinsic *MI, const Use &U, const Value *AllocaPtr) {
if (auto MTI = dyn_cast<MemTransferInst>(MI)) {
@@ -274,7 +287,8 @@ ConstantRange StackSafetyLocalAnalysis::getMemIntrinsicAccessRange(
// Non-constant size => unsafe. FIXME: try SCEV getRange.
if (!Len)
return UnknownRange;
- ConstantRange AccessRange = getAccessRange(U, AllocaPtr, Len->getZExtValue());
+ ConstantRange AccessRange =
+ getAccessRange(U, AllocaPtr, getRange(0, Len->getZExtValue()));
return AccessRange;
}