mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 12:43:36 +01:00
563a9ce27a
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
15 lines
601 B
TableGen
15 lines
601 B
TableGen
// RUN: llvm-tblgen -gen-dag-isel -I %p/../../include -I %p/Common %s | FileCheck %s
|
|
|
|
include "reg-with-subregs-common.td"
|
|
|
|
// CHECK-LABEL: OPC_CheckOpcode, TARGET_VAL(ISD::EXTRACT_SUBVECTOR),
|
|
// CHECK: OPC_CheckChild1Integer, 0,
|
|
// CHECK: OPC_EmitInteger, MVT::i32, sub0_sub1,
|
|
def : Pat<(v2i32 (extract_subvector v32i32:$src, (i32 0))),
|
|
(EXTRACT_SUBREG GPR_1024:$src, sub0_sub1)>;
|
|
|
|
// CHECK: OPC_CheckChild1Integer, 15,
|
|
// CHECK: OPC_EmitInteger, MVT::i32, 5|128,1/*133*/,
|
|
def : Pat<(v2i32 (extract_subvector v32i32:$src, (i32 15))),
|
|
(EXTRACT_SUBREG GPR_1024:$src, sub30_sub31)>;
|