Skip to content

Commit 2fe2969

Browse files
authored
[CodeGen] Simplify LLT bitfields. NFC. (#120074)
- Put the element size field in the same place for all non-pointer types. - Put the element size and address space fields in the same place for all pointer types. - Put the number of elements and scalable fields in the same place for all vector types. This simplifies initialization and accessor methods isScalable, getElementCount, getScalarSizeInBits and getAddressSpace.
1 parent b86a22a commit 2fe2969

File tree

2 files changed

+21
-72
lines changed

2 files changed

+21
-72
lines changed

llvm/include/llvm/CodeGenTypes/LowLevelType.h

Lines changed: 21 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,7 @@ class LLT {
169169
/// vector types.
170170
constexpr bool isScalable() const {
171171
assert(isVector() && "Expected a vector type");
172-
return IsPointer ? getFieldValue(PointerVectorScalableFieldInfo)
173-
: getFieldValue(VectorScalableFieldInfo);
172+
return getFieldValue(VectorScalableFieldInfo);
174173
}
175174

176175
/// Returns true if the LLT is a fixed vector. Returns false otherwise, even
@@ -183,9 +182,7 @@ class LLT {
183182

184183
constexpr ElementCount getElementCount() const {
185184
assert(IsVector && "cannot get number of elements on scalar/aggregate");
186-
return ElementCount::get(IsPointer
187-
? getFieldValue(PointerVectorElementsFieldInfo)
188-
: getFieldValue(VectorElementsFieldInfo),
185+
return ElementCount::get(getFieldValue(VectorElementsFieldInfo),
189186
isScalable());
190187
}
191188

@@ -265,25 +262,15 @@ class LLT {
265262
}
266263

267264
constexpr unsigned getScalarSizeInBits() const {
268-
if (IsScalar)
269-
return getFieldValue(ScalarSizeFieldInfo);
270-
if (IsVector) {
271-
if (!IsPointer)
272-
return getFieldValue(VectorSizeFieldInfo);
273-
else
274-
return getFieldValue(PointerVectorSizeFieldInfo);
275-
}
276-
assert(IsPointer && "unexpected LLT");
277-
return getFieldValue(PointerSizeFieldInfo);
265+
if (isPointerOrPointerVector())
266+
return getFieldValue(PointerSizeFieldInfo);
267+
return getFieldValue(ScalarSizeFieldInfo);
278268
}
279269

280270
constexpr unsigned getAddressSpace() const {
281-
assert(RawData != 0 && "Invalid Type");
282-
assert(IsPointer && "cannot get address space of non-pointer type");
283-
if (!IsVector)
284-
return getFieldValue(PointerAddressSpaceFieldInfo);
285-
else
286-
return getFieldValue(PointerVectorAddressSpaceFieldInfo);
271+
assert(isPointerOrPointerVector() &&
272+
"cannot get address space of non-pointer type");
273+
return getFieldValue(PointerAddressSpaceFieldInfo);
287274
}
288275

289276
/// Returns the vector's element type. Only valid for vector types.
@@ -352,44 +339,23 @@ class LLT {
352339
/// valid encodings, SizeInBits/SizeOfElement must be larger than 0.
353340
/// * Non-pointer scalar (isPointer == 0 && isVector == 0):
354341
/// SizeInBits: 32;
355-
static const constexpr BitFieldInfo ScalarSizeFieldInfo{32, 0};
342+
static const constexpr BitFieldInfo ScalarSizeFieldInfo{32, 29};
356343
/// * Pointer (isPointer == 1 && isVector == 0):
357344
/// SizeInBits: 16;
358345
/// AddressSpace: 24;
359-
static const constexpr BitFieldInfo PointerSizeFieldInfo{16, 0};
360-
static const constexpr BitFieldInfo PointerAddressSpaceFieldInfo{
361-
24, PointerSizeFieldInfo[0] + PointerSizeFieldInfo[1]};
362-
static_assert((PointerAddressSpaceFieldInfo[0] +
363-
PointerAddressSpaceFieldInfo[1]) <= 61,
364-
"Insufficient bits to encode all data");
346+
static const constexpr BitFieldInfo PointerSizeFieldInfo{16, 45};
347+
static const constexpr BitFieldInfo PointerAddressSpaceFieldInfo{24, 21};
365348
/// * Vector-of-non-pointer (isPointer == 0 && isVector == 1):
366349
/// NumElements: 16;
367350
/// SizeOfElement: 32;
368351
/// Scalable: 1;
369-
static const constexpr BitFieldInfo VectorElementsFieldInfo{16, 0};
370-
static const constexpr BitFieldInfo VectorSizeFieldInfo{
371-
32, VectorElementsFieldInfo[0] + VectorElementsFieldInfo[1]};
372-
static const constexpr BitFieldInfo VectorScalableFieldInfo{
373-
1, VectorSizeFieldInfo[0] + VectorSizeFieldInfo[1]};
374-
static_assert((VectorSizeFieldInfo[0] + VectorSizeFieldInfo[1]) <= 61,
375-
"Insufficient bits to encode all data");
352+
static const constexpr BitFieldInfo VectorElementsFieldInfo{16, 5};
353+
static const constexpr BitFieldInfo VectorScalableFieldInfo{1, 0};
376354
/// * Vector-of-pointer (isPointer == 1 && isVector == 1):
377355
/// NumElements: 16;
378356
/// SizeOfElement: 16;
379357
/// AddressSpace: 24;
380358
/// Scalable: 1;
381-
static const constexpr BitFieldInfo PointerVectorElementsFieldInfo{16, 0};
382-
static const constexpr BitFieldInfo PointerVectorSizeFieldInfo{
383-
16,
384-
PointerVectorElementsFieldInfo[1] + PointerVectorElementsFieldInfo[0]};
385-
static const constexpr BitFieldInfo PointerVectorAddressSpaceFieldInfo{
386-
24, PointerVectorSizeFieldInfo[1] + PointerVectorSizeFieldInfo[0]};
387-
static const constexpr BitFieldInfo PointerVectorScalableFieldInfo{
388-
1, PointerVectorAddressSpaceFieldInfo[0] +
389-
PointerVectorAddressSpaceFieldInfo[1]};
390-
static_assert((PointerVectorAddressSpaceFieldInfo[0] +
391-
PointerVectorAddressSpaceFieldInfo[1]) <= 61,
392-
"Insufficient bits to encode all data");
393359

394360
uint64_t IsScalar : 1;
395361
uint64_t IsPointer : 1;
@@ -422,28 +388,16 @@ class LLT {
422388
this->IsPointer = IsPointer;
423389
this->IsVector = IsVector;
424390
this->IsScalar = IsScalar;
425-
if (IsScalar)
426-
RawData = maskAndShift(SizeInBits, ScalarSizeFieldInfo);
427-
else if (IsVector) {
428-
assert(EC.isVector() && "invalid number of vector elements");
429-
if (!IsPointer)
430-
RawData =
431-
maskAndShift(EC.getKnownMinValue(), VectorElementsFieldInfo) |
432-
maskAndShift(SizeInBits, VectorSizeFieldInfo) |
433-
maskAndShift(EC.isScalable() ? 1 : 0, VectorScalableFieldInfo);
434-
else
435-
RawData =
436-
maskAndShift(EC.getKnownMinValue(),
437-
PointerVectorElementsFieldInfo) |
438-
maskAndShift(SizeInBits, PointerVectorSizeFieldInfo) |
439-
maskAndShift(AddressSpace, PointerVectorAddressSpaceFieldInfo) |
440-
maskAndShift(EC.isScalable() ? 1 : 0,
441-
PointerVectorScalableFieldInfo);
442-
} else if (IsPointer)
391+
if (IsPointer) {
443392
RawData = maskAndShift(SizeInBits, PointerSizeFieldInfo) |
444393
maskAndShift(AddressSpace, PointerAddressSpaceFieldInfo);
445-
else
446-
llvm_unreachable("unexpected LLT configuration");
394+
} else {
395+
RawData = maskAndShift(SizeInBits, ScalarSizeFieldInfo);
396+
}
397+
if (IsVector) {
398+
RawData |= maskAndShift(EC.getKnownMinValue(), VectorElementsFieldInfo) |
399+
maskAndShift(EC.isScalable() ? 1 : 0, VectorScalableFieldInfo);
400+
}
447401
}
448402

449403
public:

llvm/lib/CodeGenTypes/LowLevelType.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,3 @@ const constexpr LLT::BitFieldInfo LLT::PointerSizeFieldInfo;
6060
const constexpr LLT::BitFieldInfo LLT::PointerAddressSpaceFieldInfo;
6161
const constexpr LLT::BitFieldInfo LLT::VectorElementsFieldInfo;
6262
const constexpr LLT::BitFieldInfo LLT::VectorScalableFieldInfo;
63-
const constexpr LLT::BitFieldInfo LLT::VectorSizeFieldInfo;
64-
const constexpr LLT::BitFieldInfo LLT::PointerVectorElementsFieldInfo;
65-
const constexpr LLT::BitFieldInfo LLT::PointerVectorScalableFieldInfo;
66-
const constexpr LLT::BitFieldInfo LLT::PointerVectorSizeFieldInfo;
67-
const constexpr LLT::BitFieldInfo LLT::PointerVectorAddressSpaceFieldInfo;

0 commit comments

Comments
 (0)