diff --git a/llvm/test/TableGen/ConcatenatedSubregs.td b/llvm/test/TableGen/ConcatenatedSubregs.td --- a/llvm/test/TableGen/ConcatenatedSubregs.td +++ b/llvm/test/TableGen/ConcatenatedSubregs.td @@ -96,12 +96,10 @@ // CHECK-LABEL: SubRegIndex sub2: // Check inferred indexes: // CHECK-LABEL: SubRegIndex ssub1_ssub2: -// FIXME: Size should be unknown (65535). -// CHECK: Offset, Size: 16, 15 +// CHECK: Offset, Size: 16, 65535 // CHECK-LABEL: SubRegIndex ssub3_ssub4: // CHECK-LABEL: SubRegIndex ssub0_ssub1_ssub2_ssub3: -// FIXME: Size should be unknown (65535). -// CHECK: Offset, Size: 65535, 30 +// CHECK: Offset, Size: 65535, 65535 // CHECK-LABEL: SubRegIndex ssub1_ssub2_ssub3_ssub4: // Check that all subregs are generated on some examples diff --git a/llvm/utils/TableGen/CodeGenRegisters.cpp b/llvm/utils/TableGen/CodeGenRegisters.cpp --- a/llvm/utils/TableGen/CodeGenRegisters.cpp +++ b/llvm/utils/TableGen/CodeGenRegisters.cpp @@ -1369,11 +1369,15 @@ unsigned Size = Parts.front()->Size; unsigned LastOffset = Parts.front()->Offset; unsigned LastSize = Parts.front()->Size; + unsigned UnknownSize = (uint16_t)-1; for (unsigned i = 1, e = Parts.size(); i != e; ++i) { Name += '_'; Name += Parts[i]->getName(); - Size += Parts[i]->Size; - if (Parts[i]->Offset != (LastOffset + LastSize)) + if (Size == UnknownSize || Parts[i]->Size == UnknownSize) + Size = UnknownSize; + else + Size += Parts[i]->Size; + if (LastSize == UnknownSize || Parts[i]->Offset != (LastOffset + LastSize)) isContinuous = false; LastOffset = Parts[i]->Offset; LastSize = Parts[i]->Size;