From b8bbbb43e556c85618db71b4490fa531d3289459 Mon Sep 17 00:00:00 2001 From: Piotr Fusik Date: Mon, 11 Aug 2025 12:36:37 +0200 Subject: [PATCH 1/5] [TableGen][test] Test INT64_MIN literals --- .../TableGen/GlobalISelEmitter/int64min.td | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 llvm/test/TableGen/GlobalISelEmitter/int64min.td diff --git a/llvm/test/TableGen/GlobalISelEmitter/int64min.td b/llvm/test/TableGen/GlobalISelEmitter/int64min.td new file mode 100644 index 0000000000000..01c101ebe67bd --- /dev/null +++ b/llvm/test/TableGen/GlobalISelEmitter/int64min.td @@ -0,0 +1,30 @@ +// RUN: llvm-tblgen -gen-global-isel -optimize-match-table=false -I %p/../../../include -I %p/../Common %s | FileCheck %s + +include "llvm/Target/Target.td" +include "GlobalISelEmitterCommon.td" + +def GPR : RegisterClass<"MyTarget", [i64], 64, (add R0)>; +def ANDI : I<(outs GPR:$dst), (ins GPR:$src1, i64imm:$src2), []>; + +// CHECK-LABEL: GIM_Try, /*On fail goto*//*Label 0*/ GIMT_Encode4(59), // Rule ID 0 // +// CHECK-NEXT: GIM_CheckNumOperands, /*MI*/0, /*Expected*/3, +// CHECK-NEXT: GIM_CheckOpcode, /*MI*/0, GIMT_Encode2(TargetOpcode::G_AND), +// CHECK-NEXT: // MIs[0] DstI[dst] +// CHECK-NEXT: GIM_RootCheckType, /*Op*/0, /*Type*/GILLT_s64, +// CHECK-NEXT: GIM_RootCheckRegBankForClass, /*Op*/0, /*RC*/GIMT_Encode2(MyTarget::GPRRegClassID), +// CHECK-NEXT: // MIs[0] rs1 +// CHECK-NEXT: GIM_RootCheckType, /*Op*/1, /*Type*/GILLT_s64, +// CHECK-NEXT: GIM_RootCheckRegBankForClass, /*Op*/1, /*RC*/GIMT_Encode2(MyTarget::GPRRegClassID), +// CHECK-NEXT: // MIs[0] Operand 2 +// CHECK-NEXT: GIM_RootCheckType, /*Op*/2, /*Type*/GILLT_s64, +// CHECK-NEXT: GIM_CheckConstantInt, /*MI*/0, /*Op*/2, GIMT_Encode8(-9223372036854775808), +// CHECK-NEXT: // (and:{ *:[i64] } GPR:{ *:[i64] }:$rs1, -9223372036854775808:{ *:[i64] }) => (ANDI:{ *:[i64] } GPR:{ *:[i64] }:$rs1, -9223372036854775808:{ *:[i64] }) +// CHECK-NEXT: GIR_BuildRootMI, /*Opcode*/GIMT_Encode2(MyTarget::ANDI), +// CHECK-NEXT: GIR_RootToRootCopy, /*OpIdx*/0, // DstI[dst] +// CHECK-NEXT: GIR_RootToRootCopy, /*OpIdx*/1, // rs1 +// CHECK-NEXT: GIR_AddImm, /*InsnID*/0, /*Imm*/GIMT_Encode8(-9223372036854775808), +// CHECK-NEXT: GIR_RootConstrainSelectedInstOperands, +// CHECK-NEXT: // GIR_Coverage, 0, +// CHECK-NEXT: GIR_EraseRootFromParent_Done, +def : Pat<(and GPR:$rs1, 0x8000000000000000), + (ANDI GPR:$rs1, 0x8000000000000000)>; From bddfa1b60f01790a22f3a6dcad4c4191491f7da6 Mon Sep 17 00:00:00 2001 From: Piotr Fusik Date: Wed, 13 Aug 2025 12:57:21 +0200 Subject: [PATCH 2/5] [TableGen] Make integers in GlobalISelMatchTable unsigned The numbers are stored in an `uint8_t` array, either directly or via `GIMT_Encode2/4/8` macros (see `getEncodedEmitStr` and `emitEncodingMacrosDef`). Passing negative numbers only adds confusion and results in a warning for the `INT64_MIN` value (C++ parses `-9223372036854775808` as two tokens: a unary minus and an unsigned integer, triggered in #151687). --- .../GlobalISelEmitter/GlobalISelEmitter.td | 18 +++++++++--------- .../TableGen/GlobalISelEmitter/int64min.td | 4 ++-- .../Common/GlobalISel/GlobalISelMatchTable.cpp | 7 ++++--- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/llvm/test/TableGen/GlobalISelEmitter/GlobalISelEmitter.td b/llvm/test/TableGen/GlobalISelEmitter/GlobalISelEmitter.td index 4a516c6e0235c..7a86b5b726a82 100644 --- a/llvm/test/TableGen/GlobalISelEmitter/GlobalISelEmitter.td +++ b/llvm/test/TableGen/GlobalISelEmitter/GlobalISelEmitter.td @@ -617,11 +617,11 @@ def MOV : I<(outs GPR32:$dst), (ins GPR32:$src1), // R02N-NEXT: // MIs[0] Operand 2 // R02N-NEXT: GIM_RootCheckType, /*Op*/2, /*Type*/GILLT_s32, // -// R02C-NEXT: GIM_CheckConstantInt8, /*MI*/0, /*Op*/2, uint8_t(-2) +// R02C-NEXT: GIM_CheckConstantInt8, /*MI*/0, /*Op*/2, 254, // R02C-NEXT: // (xor:{ *:[i32] } GPR32:{ *:[i32] }:$src1, -2:{ *:[i32] }) => (XORI:{ *:[i32] } GPR32:{ *:[i32] }:$src1) // R02C-NEXT: GIR_BuildRootMI, /*Opcode*/GIMT_Encode2(MyTarget::XORI), // R02C-NEXT: GIR_RootToRootCopy, /*OpIdx*/0, // DstI[dst] -// R02C-NEXT: GIR_AddImm8, /*InsnID*/0, /*Imm*/uint8_t(-1), +// R02C-NEXT: GIR_AddImm8, /*InsnID*/0, /*Imm*/255, // R02C-NEXT: GIR_RootToRootCopy, /*OpIdx*/1, // src1 // R02C-NEXT: GIR_RootConstrainSelectedInstOperands, // R02C-NEXT: // GIR_Coverage, 2, @@ -648,7 +648,7 @@ def XORI : I<(outs GPR32:$dst), (ins m1:$src2, GPR32:$src1), // NOOPT-NEXT: GIM_RootCheckRegBankForClass, /*Op*/1, /*RC*/GIMT_Encode2(MyTarget::GPR32RegClassID), // NOOPT-NEXT: // MIs[0] Operand 2 // NOOPT-NEXT: GIM_RootCheckType, /*Op*/2, /*Type*/GILLT_s32, -// NOOPT-NEXT: GIM_CheckConstantInt8, /*MI*/0, /*Op*/2, uint8_t(-3) +// NOOPT-NEXT: GIM_CheckConstantInt8, /*MI*/0, /*Op*/2, 253, // NOOPT-NEXT: // (xor:{ *:[i32] } GPR32:{ *:[i32] }:$src1, -3:{ *:[i32] }) => (XOR:{ *:[i32] } GPR32:{ *:[i32] }:$src1) // NOOPT-NEXT: GIR_BuildRootMI, /*Opcode*/GIMT_Encode2(MyTarget::XOR), // NOOPT-NEXT: GIR_RootToRootCopy, /*OpIdx*/0, // DstI[dst] @@ -676,11 +676,11 @@ def XOR : I<(outs GPR32:$dst), (ins Z:$src2, GPR32:$src1), // NOOPT-NEXT: GIM_RootCheckRegBankForClass, /*Op*/1, /*RC*/GIMT_Encode2(MyTarget::GPR32RegClassID), // NOOPT-NEXT: // MIs[0] Operand 2 // NOOPT-NEXT: GIM_RootCheckType, /*Op*/2, /*Type*/GILLT_s32, -// NOOPT-NEXT: GIM_CheckConstantInt8, /*MI*/0, /*Op*/2, uint8_t(-4) +// NOOPT-NEXT: GIM_CheckConstantInt8, /*MI*/0, /*Op*/2, 252, // NOOPT-NEXT: // (xor:{ *:[i32] } GPR32:{ *:[i32] }:$src1, -4:{ *:[i32] }) => (XORlike:{ *:[i32] } GPR32:{ *:[i32] }:$src1) // NOOPT-NEXT: GIR_BuildRootMI, /*Opcode*/GIMT_Encode2(MyTarget::XORlike), // NOOPT-NEXT: GIR_RootToRootCopy, /*OpIdx*/0, // DstI[dst] -// NOOPT-NEXT: GIR_AddImm8, /*InsnID*/0, /*Imm*/uint8_t(-1), +// NOOPT-NEXT: GIR_AddImm8, /*InsnID*/0, /*Imm*/255, // NOOPT-NEXT: GIR_AddRegister, /*InsnID*/0, GIMT_Encode2(MyTarget::R0), // NOOPT-NEXT: GIR_RootToRootCopy, /*OpIdx*/1, // src1 // NOOPT-NEXT: GIR_RootConstrainSelectedInstOperands, @@ -705,11 +705,11 @@ def XORlike : I<(outs GPR32:$dst), (ins m1Z:$src2, GPR32:$src1), // NOOPT-NEXT: GIM_RootCheckRegBankForClass, /*Op*/1, /*RC*/GIMT_Encode2(MyTarget::GPR32RegClassID), // NOOPT-NEXT: // MIs[0] Operand 2 // NOOPT-NEXT: GIM_RootCheckType, /*Op*/2, /*Type*/GILLT_s32, -// NOOPT-NEXT: GIM_CheckConstantInt8, /*MI*/0, /*Op*/2, uint8_t(-5), +// NOOPT-NEXT: GIM_CheckConstantInt8, /*MI*/0, /*Op*/2, 251, // NOOPT-NEXT: // (xor:{ *:[i32] } GPR32:{ *:[i32] }:$src1, -5:{ *:[i32] }) => (XORManyDefaults:{ *:[i32] } GPR32:{ *:[i32] }:$src1) // NOOPT-NEXT: GIR_BuildRootMI, /*Opcode*/GIMT_Encode2(MyTarget::XORManyDefaults), // NOOPT-NEXT: GIR_RootToRootCopy, /*OpIdx*/0, // DstI[dst] -// NOOPT-NEXT: GIR_AddImm8, /*InsnID*/0, /*Imm*/uint8_t(-1), +// NOOPT-NEXT: GIR_AddImm8, /*InsnID*/0, /*Imm*/255, // NOOPT-NEXT: GIR_AddRegister, /*InsnID*/0, GIMT_Encode2(MyTarget::R0), // NOOPT-NEXT: GIR_AddRegister, /*InsnID*/0, GIMT_Encode2(MyTarget::R0), // NOOPT-NEXT: GIR_RootToRootCopy, /*OpIdx*/1, // src1 @@ -735,7 +735,7 @@ def XORManyDefaults : I<(outs GPR32:$dst), (ins m1Z:$src3, Z:$src2, GPR32:$src1) // NOOPT-NEXT: GIM_RootCheckRegBankForClass, /*Op*/1, /*RC*/GIMT_Encode2(MyTarget::GPR32RegClassID), // NOOPT-NEXT: // MIs[0] Operand 2 // NOOPT-NEXT: GIM_RootCheckType, /*Op*/2, /*Type*/GILLT_s32, -// NOOPT-NEXT: GIM_CheckConstantInt8, /*MI*/0, /*Op*/2, uint8_t(-6) +// NOOPT-NEXT: GIM_CheckConstantInt8, /*MI*/0, /*Op*/2, 250, // NOOPT-NEXT: // (xor:{ *:[i32] } GPR32:{ *:[i32] }:$src1, -6:{ *:[i32] }) => (XORIb:{ *:[i32] } GPR32:{ *:[i32] }:$src1) // NOOPT-NEXT: GIR_BuildRootMI, /*Opcode*/GIMT_Encode2(MyTarget::XORIb), // NOOPT-NEXT: GIR_RootToRootCopy, /*OpIdx*/0, // DstI[dst] @@ -766,7 +766,7 @@ def XORIb : I<(outs GPR32:$dst), (ins mb:$src2, GPR32:$src1), // NOOPT-NEXT: GIM_RootCheckRegBankForClass, /*Op*/1, /*RC*/GIMT_Encode2(MyTarget::GPR32RegClassID), // NOOPT-NEXT: // MIs[0] Operand 2 // NOOPT-NEXT: GIM_RootCheckType, /*Op*/2, /*Type*/GILLT_s32, -// NOOPT-NEXT: GIM_CheckConstantInt8, /*MI*/0, /*Op*/2, uint8_t(-1), +// NOOPT-NEXT: GIM_CheckConstantInt8, /*MI*/0, /*Op*/2, 255, // NOOPT-NEXT: // (xor:{ *:[i32] } GPR32:{ *:[i32] }:$Wm, -1:{ *:[i32] }) => (ORN:{ *:[i32] } R0:{ *:[i32] }, GPR32:{ *:[i32] }:$Wm) // NOOPT-NEXT: GIR_BuildRootMI, /*Opcode*/GIMT_Encode2(MyTarget::ORN), // NOOPT-NEXT: GIR_RootToRootCopy, /*OpIdx*/0, // DstI[dst] diff --git a/llvm/test/TableGen/GlobalISelEmitter/int64min.td b/llvm/test/TableGen/GlobalISelEmitter/int64min.td index 01c101ebe67bd..ec80537bc3a74 100644 --- a/llvm/test/TableGen/GlobalISelEmitter/int64min.td +++ b/llvm/test/TableGen/GlobalISelEmitter/int64min.td @@ -17,12 +17,12 @@ def ANDI : I<(outs GPR:$dst), (ins GPR:$src1, i64imm:$src2), []>; // CHECK-NEXT: GIM_RootCheckRegBankForClass, /*Op*/1, /*RC*/GIMT_Encode2(MyTarget::GPRRegClassID), // CHECK-NEXT: // MIs[0] Operand 2 // CHECK-NEXT: GIM_RootCheckType, /*Op*/2, /*Type*/GILLT_s64, -// CHECK-NEXT: GIM_CheckConstantInt, /*MI*/0, /*Op*/2, GIMT_Encode8(-9223372036854775808), +// CHECK-NEXT: GIM_CheckConstantInt, /*MI*/0, /*Op*/2, GIMT_Encode8(9223372036854775808), // CHECK-NEXT: // (and:{ *:[i64] } GPR:{ *:[i64] }:$rs1, -9223372036854775808:{ *:[i64] }) => (ANDI:{ *:[i64] } GPR:{ *:[i64] }:$rs1, -9223372036854775808:{ *:[i64] }) // CHECK-NEXT: GIR_BuildRootMI, /*Opcode*/GIMT_Encode2(MyTarget::ANDI), // CHECK-NEXT: GIR_RootToRootCopy, /*OpIdx*/0, // DstI[dst] // CHECK-NEXT: GIR_RootToRootCopy, /*OpIdx*/1, // rs1 -// CHECK-NEXT: GIR_AddImm, /*InsnID*/0, /*Imm*/GIMT_Encode8(-9223372036854775808), +// CHECK-NEXT: GIR_AddImm, /*InsnID*/0, /*Imm*/GIMT_Encode8(9223372036854775808), // CHECK-NEXT: GIR_RootConstrainSelectedInstOperands, // CHECK-NEXT: // GIR_Coverage, 0, // CHECK-NEXT: GIR_EraseRootFromParent_Done, diff --git a/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp b/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp index 70141ba738bdb..a109c096a23df 100644 --- a/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp +++ b/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp @@ -237,9 +237,10 @@ MatchTableRecord MatchTable::NamedValue(unsigned NumBytes, StringRef Namespace, MatchTableRecord MatchTable::IntValue(unsigned NumBytes, int64_t IntValue) { assert(isUIntN(NumBytes * 8, IntValue) || isIntN(NumBytes * 8, IntValue)); - auto Str = llvm::to_string(IntValue); - if (NumBytes == 1 && IntValue < 0) - Str = "uint8_t(" + Str + ")"; + uint64_t UIntValue = IntValue; + if (NumBytes < 8) + UIntValue &= (UINT64_C(1) << NumBytes * 8) - 1; + auto Str = llvm::to_string(UIntValue); // TODO: Could optimize this directly to save the compiler some work when // building the file return MatchTableRecord(std::nullopt, Str, NumBytes, From ddf173d411d880ae5ff18c00ed6228db11f7e63f Mon Sep 17 00:00:00 2001 From: Piotr Fusik Date: Wed, 13 Aug 2025 13:09:18 +0200 Subject: [PATCH 3/5] [TableGen][NFC] Parenthesize parameters in `GIMT_Encode2/4/8` macros And avoid unnecessary casts. --- .../GlobalISel/GlobalISelMatchTable.cpp | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp b/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp index a109c096a23df..93a236ff41ccf 100644 --- a/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp +++ b/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp @@ -53,26 +53,26 @@ constexpr StringLiteral EncodeMacroName = "GIMT_Encode"; void emitEncodingMacrosDef(raw_ostream &OS) { OS << "#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__\n" << "#define " << EncodeMacroName << "2(Val)" - << " uint8_t(Val), uint8_t((uint16_t)Val >> 8)\n" + << " uint8_t(Val), uint8_t((Val) >> 8)\n" << "#define " << EncodeMacroName << "4(Val)" - << " uint8_t(Val), uint8_t((uint32_t)Val >> 8), " - "uint8_t((uint32_t)Val >> 16), uint8_t((uint32_t)Val >> 24)\n" + << " uint8_t(Val), uint8_t((Val) >> 8), " + "uint8_t((Val) >> 16), uint8_t((Val) >> 24)\n" << "#define " << EncodeMacroName << "8(Val)" - << " uint8_t(Val), uint8_t((uint64_t)Val >> 8), " - "uint8_t((uint64_t)Val >> 16), uint8_t((uint64_t)Val >> 24), " - "uint8_t((uint64_t)Val >> 32), uint8_t((uint64_t)Val >> 40), " - "uint8_t((uint64_t)Val >> 48), uint8_t((uint64_t)Val >> 56)\n" + << " uint8_t(Val), uint8_t((Val) >> 8), " + "uint8_t((Val) >> 16), uint8_t((Val) >> 24), " + "uint8_t(uint64_t(Val) >> 32), uint8_t(uint64_t(Val) >> 40), " + "uint8_t(uint64_t(Val) >> 48), uint8_t(uint64_t(Val) >> 56)\n" << "#else\n" << "#define " << EncodeMacroName << "2(Val)" - << " uint8_t((uint16_t)Val >> 8), uint8_t(Val)\n" + << " uint8_t((Val) >> 8), uint8_t(Val)\n" << "#define " << EncodeMacroName << "4(Val)" - << " uint8_t((uint32_t)Val >> 24), uint8_t((uint32_t)Val >> 16), " - "uint8_t((uint32_t)Val >> 8), uint8_t(Val)\n" + << " uint8_t((Val) >> 24), uint8_t((Val) >> 16), " + "uint8_t((Val) >> 8), uint8_t(Val)\n" << "#define " << EncodeMacroName << "8(Val)" - << " uint8_t((uint64_t)Val >> 56), uint8_t((uint64_t)Val >> 48), " - "uint8_t((uint64_t)Val >> 40), uint8_t((uint64_t)Val >> 32), " - "uint8_t((uint64_t)Val >> 24), uint8_t((uint64_t)Val >> 16), " - "uint8_t((uint64_t)Val >> 8), uint8_t(Val)\n" + << " uint8_t(uint64_t(Val) >> 56), uint8_t(uint64_t(Val) >> 48), " + "uint8_t(uint64_t(Val) >> 40), uint8_t(uint64_t(Val) >> 32), " + "uint8_t((Val) >> 24), uint8_t((Val) >> 16), " + "uint8_t((Val) >> 8), uint8_t(Val)\n" << "#endif\n"; } From e0854e06964b1c3c6533899b11e53ac34465d024 Mon Sep 17 00:00:00 2001 From: Piotr Fusik Date: Wed, 13 Aug 2025 15:03:16 +0200 Subject: [PATCH 4/5] [TableGen][test] Update tests --- .../GlobalISelCombinerEmitter/match-table-typeof.td | 12 ++++++------ .../GlobalISelCombinerEmitter/match-table.td | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/llvm/test/TableGen/GlobalISelCombinerEmitter/match-table-typeof.td b/llvm/test/TableGen/GlobalISelCombinerEmitter/match-table-typeof.td index 7fe63b1298ae7..ef918d47b9d88 100644 --- a/llvm/test/TableGen/GlobalISelCombinerEmitter/match-table-typeof.td +++ b/llvm/test/TableGen/GlobalISelCombinerEmitter/match-table-typeof.td @@ -20,18 +20,18 @@ def Test0 : GICombineRule< // CHECK-NEXT: GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule0Enabled), // CHECK-NEXT: GIM_CheckOpcode, /*MI*/0, GIMT_Encode2(TargetOpcode::G_MUL), // CHECK-NEXT: // MIs[0] dst -// CHECK-NEXT: GIM_RecordRegType, /*MI*/0, /*Op*/0, /*TempTypeIdx*/uint8_t(-1), +// CHECK-NEXT: GIM_RecordRegType, /*MI*/0, /*Op*/0, /*TempTypeIdx*/255, // CHECK-NEXT: // MIs[0] src -// CHECK-NEXT: GIM_RecordRegType, /*MI*/0, /*Op*/1, /*TempTypeIdx*/uint8_t(-2), +// CHECK-NEXT: GIM_RecordRegType, /*MI*/0, /*Op*/1, /*TempTypeIdx*/254, // CHECK-NEXT: // MIs[0] Operand 2 -// CHECK-NEXT: GIM_CheckConstantInt8, /*MI*/0, /*Op*/2, uint8_t(-1), -// CHECK-NEXT: GIR_MakeTempReg, /*TempRegID*/1, /*TypeID*/uint8_t(-2), +// CHECK-NEXT: GIM_CheckConstantInt8, /*MI*/0, /*Op*/2, 255, +// CHECK-NEXT: GIR_MakeTempReg, /*TempRegID*/1, /*TypeID*/254, // CHECK-NEXT: GIR_BuildConstant, /*TempRegID*/1, /*Val*/GIMT_Encode8(0), -// CHECK-NEXT: GIR_MakeTempReg, /*TempRegID*/0, /*TypeID*/uint8_t(-1), +// CHECK-NEXT: GIR_MakeTempReg, /*TempRegID*/0, /*TypeID*/255, // CHECK-NEXT: // Combiner Rule #0: Test0 // CHECK-NEXT: GIR_BuildRootMI, /*Opcode*/GIMT_Encode2(TargetOpcode::G_CONSTANT), // CHECK-NEXT: GIR_AddTempRegister, /*InsnID*/0, /*TempRegID*/0, /*TempRegFlags*/GIMT_Encode2(RegState::Define), -// CHECK-NEXT: GIR_AddCImm, /*InsnID*/0, /*Type*/uint8_t(-2), /*Imm*/GIMT_Encode8(42), +// CHECK-NEXT: GIR_AddCImm, /*InsnID*/0, /*Type*/254, /*Imm*/GIMT_Encode8(42), // CHECK-NEXT: GIR_BuildMI, /*InsnID*/1, /*Opcode*/GIMT_Encode2(TargetOpcode::G_SUB), // CHECK-NEXT: GIR_Copy, /*NewInsnID*/1, /*OldInsnID*/0, /*OpIdx*/0, // dst // CHECK-NEXT: GIR_AddSimpleTempRegister, /*InsnID*/1, /*TempRegID*/1, diff --git a/llvm/test/TableGen/GlobalISelCombinerEmitter/match-table.td b/llvm/test/TableGen/GlobalISelCombinerEmitter/match-table.td index 92baab91c620e..0c1ef2478c708 100644 --- a/llvm/test/TableGen/GlobalISelCombinerEmitter/match-table.td +++ b/llvm/test/TableGen/GlobalISelCombinerEmitter/match-table.td @@ -181,7 +181,7 @@ def MyCombiner: GICombiner<"GenMyCombiner", [ // CHECK-NEXT: GIM_RecordInsnIgnoreCopies, /*DefineMI*/1, /*MI*/0, /*OpIdx*/1, // MIs[1] // CHECK-NEXT: GIM_CheckOpcode, /*MI*/1, GIMT_Encode2(TargetOpcode::G_CONSTANT), // CHECK-NEXT: // MIs[1] z -// CHECK-NEXT: GIM_CheckLiteralInt, /*MI*/1, /*Op*/1, GIMT_Encode8(-42), +// CHECK-NEXT: GIM_CheckLiteralInt, /*MI*/1, /*Op*/1, GIMT_Encode8(18446744073709551574), // CHECK-NEXT: GIM_CheckConstantInt8, /*MI*/0, /*Op*/2, 43, // CHECK-NEXT: GIM_CheckIsSafeToFold, /*NumInsns*/1, // CHECK-NEXT: // Combiner Rule #5: InOutInstTest1 From 2da53caa3103cf26f0c7508be0108a2be135a3f6 Mon Sep 17 00:00:00 2001 From: Piotr Fusik Date: Wed, 13 Aug 2025 15:40:26 +0200 Subject: [PATCH 5/5] [TableGen] Make variable type explicit --- llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp b/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp index 93a236ff41ccf..d281a86ff6a11 100644 --- a/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp +++ b/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp @@ -240,7 +240,7 @@ MatchTableRecord MatchTable::IntValue(unsigned NumBytes, int64_t IntValue) { uint64_t UIntValue = IntValue; if (NumBytes < 8) UIntValue &= (UINT64_C(1) << NumBytes * 8) - 1; - auto Str = llvm::to_string(UIntValue); + std::string Str = llvm::to_string(UIntValue); // TODO: Could optimize this directly to save the compiler some work when // building the file return MatchTableRecord(std::nullopt, Str, NumBytes,