Skip to content

Commit 294fdd9

Browse files
committed
[TableGen] Fix SubRegIndex size computation for concatenated subregs of unknown size
When calculating the size of concatenated subregisters, and at least one of the subregisters involved has an unknown size (-1), then the concatenated size should be set to -1 as well. This bug was found for an out-of-tree target. Looking at lib/Target the only in-tree target that has a subregister with unknown size is X86: X86RegisterInfo.td: def sub_mask_0 : SubRegIndex<-1>; But it looks like sub_mask_0 don't result in any concatenated subreg index with faulty size if looking at X86SubRegIdxRanges[]. Differential Revision: https://reviews.llvm.org/D138341
1 parent a6cb924 commit 294fdd9

File tree

2 files changed

+8
-6
lines changed

2 files changed

+8
-6
lines changed

llvm/test/TableGen/ConcatenatedSubregs.td

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,10 @@ def TestTarget : Target;
9696
// CHECK-LABEL: SubRegIndex sub2:
9797
// Check inferred indexes:
9898
// CHECK-LABEL: SubRegIndex ssub1_ssub2:
99-
// FIXME: Size should be unknown (65535).
100-
// CHECK: Offset, Size: 16, 15
99+
// CHECK: Offset, Size: 16, 65535
101100
// CHECK-LABEL: SubRegIndex ssub3_ssub4:
102101
// CHECK-LABEL: SubRegIndex ssub0_ssub1_ssub2_ssub3:
103-
// FIXME: Size should be unknown (65535).
104-
// CHECK: Offset, Size: 65535, 30
102+
// CHECK: Offset, Size: 65535, 65535
105103
// CHECK-LABEL: SubRegIndex ssub1_ssub2_ssub3_ssub4:
106104

107105
// Check that all subregs are generated on some examples

llvm/utils/TableGen/CodeGenRegisters.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,11 +1369,15 @@ getConcatSubRegIndex(const SmallVector<CodeGenSubRegIndex *, 8> &Parts) {
13691369
unsigned Size = Parts.front()->Size;
13701370
unsigned LastOffset = Parts.front()->Offset;
13711371
unsigned LastSize = Parts.front()->Size;
1372+
unsigned UnknownSize = (uint16_t)-1;
13721373
for (unsigned i = 1, e = Parts.size(); i != e; ++i) {
13731374
Name += '_';
13741375
Name += Parts[i]->getName();
1375-
Size += Parts[i]->Size;
1376-
if (Parts[i]->Offset != (LastOffset + LastSize))
1376+
if (Size == UnknownSize || Parts[i]->Size == UnknownSize)
1377+
Size = UnknownSize;
1378+
else
1379+
Size += Parts[i]->Size;
1380+
if (LastSize == UnknownSize || Parts[i]->Offset != (LastOffset + LastSize))
13771381
isContinuous = false;
13781382
LastOffset = Parts[i]->Offset;
13791383
LastSize = Parts[i]->Size;

0 commit comments

Comments
 (0)