[TBLGEN] Fix subreg value overflow in DAGISelMatcher
authorStanislav Mekhanoshin <Stanislav.Mekhanoshin@amd.com>
Mon, 10 Feb 2020 21:37:00 +0000 (13:37 -0800)
committerStanislav Mekhanoshin <Stanislav.Mekhanoshin@amd.com>
Wed, 12 Feb 2020 21:29:57 +0000 (13:29 -0800)
commitf8d044bbcfdc9e1ddc02247ffb86fe39e1f277f0
tree01d1af19062165e43159266d93bf601354ba4839
parentbaf3a53b5750a0b1363248d45b0fa0cbda0253e1
[TBLGEN] Fix subreg value overflow in DAGISelMatcher

Tablegen's DAGISelMatcher emits integers in a VBR format,
so if an integer is below 128 it can fit into a single
byte, otherwise high bit is set, next byte is used etc.
MatcherTable is essentially an unsigned char table. When
SelectionDAGISel parses the table it does a reverse translation.

In a situation when numeric value of an integer to emit is
unknown it can be emitted not as OPC_EmitInteger but as
OPC_EmitStringInteger using a symbolic name of the value.
In this situation the value should not exceed 127.

One of the situations when OPC_EmitStringInteger is used is
if we need to emit a subreg into a matcher table. However,
number of subregs can exceed 127. Currently last defined subreg
for AMDGPU is 192. That results in a silent bug in the ISel
with matcher reading from an invalid offset.

Fixed this bug to emit actual VBR encoded value for a subregs
which value exceeds 127.

Differential Revision: https://reviews.llvm.org/D74368
llvm/test/TableGen/Common/reg-with-subregs-common.td [new file with mode: 0644]
llvm/test/TableGen/dag-isel-subregs.td [new file with mode: 0644]
llvm/utils/TableGen/CodeGenRegisters.cpp
llvm/utils/TableGen/CodeGenRegisters.h
llvm/utils/TableGen/DAGISelMatcherEmitter.cpp
llvm/utils/TableGen/DAGISelMatcherGen.cpp
llvm/utils/TableGen/RegisterInfoEmitter.cpp