[llvm] 8e0148d - [AllocaInst] Update `getAllocationSizeInBits` to return `TypeSize`.
Francesco Petrogalli via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 27 08:40:56 PST 2020
Author: Francesco Petrogalli
Date: 2020-11-27T16:39:10Z
New Revision: 8e0148dff703dd1ff12cc143482274233a8dacf3
URL: https://github.com/llvm/llvm-project/commit/8e0148dff703dd1ff12cc143482274233a8dacf3
DIFF: https://github.com/llvm/llvm-project/commit/8e0148dff703dd1ff12cc143482274233a8dacf3.diff
LOG: [AllocaInst] Update `getAllocationSizeInBits` to return `TypeSize`.
Reviewed By: peterwaller-arm, sdesmalen
Differential Revision: https://reviews.llvm.org/D92020
Added:
Modified:
llvm/include/llvm/IR/Instructions.h
llvm/lib/IR/Instructions.cpp
llvm/lib/Transforms/Coroutines/CoroFrame.cpp
llvm/unittests/IR/InstructionsTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/IR/Instructions.h b/llvm/include/llvm/IR/Instructions.h
index ea1a60d52c87..eb855972256b 100644
--- a/llvm/include/llvm/IR/Instructions.h
+++ b/llvm/include/llvm/IR/Instructions.h
@@ -106,7 +106,7 @@ class AllocaInst : public UnaryInstruction {
/// Get allocation size in bits. Returns None if size can't be determined,
/// e.g. in case of a VLA.
- Optional<uint64_t> getAllocationSizeInBits(const DataLayout &DL) const;
+ Optional<TypeSize> getAllocationSizeInBits(const DataLayout &DL) const;
/// Return the type that is being allocated by the instruction.
Type *getAllocatedType() const { return AllocatedType; }
diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp
index ee667cfc42e8..10427b22d5d7 100644
--- a/llvm/lib/IR/Instructions.cpp
+++ b/llvm/lib/IR/Instructions.cpp
@@ -49,13 +49,14 @@ using namespace llvm;
// AllocaInst Class
//===----------------------------------------------------------------------===//
-Optional<uint64_t>
+Optional<TypeSize>
AllocaInst::getAllocationSizeInBits(const DataLayout &DL) const {
- uint64_t Size = DL.getTypeAllocSizeInBits(getAllocatedType());
+ TypeSize Size = DL.getTypeAllocSizeInBits(getAllocatedType());
if (isArrayAllocation()) {
auto *C = dyn_cast<ConstantInt>(getArraySize());
if (!C)
return None;
+ assert(!Size.isScalable() && "Array elements cannot have a scalable size");
Size *= C->getZExtValue();
}
return Size;
diff --git a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp
index 204fb5d8f4c7..1a000c1913c6 100644
--- a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp
+++ b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp
@@ -576,9 +576,10 @@ void FrameTypeBuilder::addFieldForAllocas(const Function &F,
StackLifetimeAnalyzer.getLiveRange(AI2));
};
auto GetAllocaSize = [&](const AllocaInfo &A) {
- Optional<uint64_t> RetSize = A.Alloca->getAllocationSizeInBits(DL);
- assert(RetSize && "We can't handle scalable type now.\n");
- return RetSize.getValue();
+ Optional<TypeSize> RetSize = A.Alloca->getAllocationSizeInBits(DL);
+ assert(RetSize && "Variable Length Arrays (VLA) are not supported.\n");
+ assert(!RetSize->isScalable() && "Scalable vectors are not yet supported");
+ return RetSize->getFixedSize();
};
// Put larger allocas in the front. So the larger allocas have higher
// priority to merge, which can save more space potentially. Also each
diff --git a/llvm/unittests/IR/InstructionsTest.cpp b/llvm/unittests/IR/InstructionsTest.cpp
index 93801b84e73f..dfd292ff60bb 100644
--- a/llvm/unittests/IR/InstructionsTest.cpp
+++ b/llvm/unittests/IR/InstructionsTest.cpp
@@ -1400,5 +1400,45 @@ TEST(InstructionsTest, BranchWeightOverflow) {
ASSERT_EQ(ProfWeight, UINT32_MAX);
}
+TEST(InstructionsTest, AllocaInst) {
+ LLVMContext Ctx;
+ std::unique_ptr<Module> M = parseIR(Ctx, R"(
+ %T = type { i64, [3 x i32]}
+ define void @f(i32 %n) {
+ entry:
+ %A = alloca i32, i32 1
+ %B = alloca i32, i32 4
+ %C = alloca i32, i32 %n
+ %D = alloca <8 x double>
+ %E = alloca <vscale x 8 x double>
+ %F = alloca [2 x half]
+ %G = alloca [2 x [3 x i128]]
+ %H = alloca %T
+ ret void
+ }
+ )");
+ const DataLayout &DL = M->getDataLayout();
+ ASSERT_TRUE(M);
+ Function *Fun = cast<Function>(M->getNamedValue("f"));
+ BasicBlock &BB = Fun->front();
+ auto It = BB.begin();
+ AllocaInst &A = cast<AllocaInst>(*It++);
+ AllocaInst &B = cast<AllocaInst>(*It++);
+ AllocaInst &C = cast<AllocaInst>(*It++);
+ AllocaInst &D = cast<AllocaInst>(*It++);
+ AllocaInst &E = cast<AllocaInst>(*It++);
+ AllocaInst &F = cast<AllocaInst>(*It++);
+ AllocaInst &G = cast<AllocaInst>(*It++);
+ AllocaInst &H = cast<AllocaInst>(*It++);
+ EXPECT_EQ(A.getAllocationSizeInBits(DL), TypeSize::getFixed(32));
+ EXPECT_EQ(B.getAllocationSizeInBits(DL), TypeSize::getFixed(128));
+ EXPECT_FALSE(C.getAllocationSizeInBits(DL));
+ EXPECT_EQ(D.getAllocationSizeInBits(DL), TypeSize::getFixed(512));
+ EXPECT_EQ(E.getAllocationSizeInBits(DL), TypeSize::getScalable(512));
+ EXPECT_EQ(F.getAllocationSizeInBits(DL), TypeSize::getFixed(32));
+ EXPECT_EQ(G.getAllocationSizeInBits(DL), TypeSize::getFixed(768));
+ EXPECT_EQ(H.getAllocationSizeInBits(DL), TypeSize::getFixed(160));
+}
+
} // end anonymous namespace
} // end namespace llvm
More information about the llvm-commits
mailing list