diff --git a/llvm/docs/GlobalISel/GenericOpcode.rst b/llvm/docs/GlobalISel/GenericOpcode.rst index a39994ca8f33d..4816094fd4b6b 100644 --- a/llvm/docs/GlobalISel/GenericOpcode.rst +++ b/llvm/docs/GlobalISel/GenericOpcode.rst @@ -148,6 +148,33 @@ G_EXTRACT for scalar types, but acts elementwise on vectors. %1:_(s16) = G_TRUNC %0:_(s32) +G_TRUNC_SSAT_S +^^^^^^^^^^^^^^ + +Truncate a signed input to a signed result with saturation. + +.. code-block:: none + + %1:_(s16) = G_TRUNC_SSAT_S %0:_(s32) + +G_TRUNC_SSAT_U +^^^^^^^^^^^^^^ + +Truncate a signed input to an unsigned result with saturation. + +.. code-block:: none + + %1:_(s16) = G_TRUNC_SSAT_U %0:_(s32) + +G_TRUNC_USAT_U +^^^^^^^^^^^^^^ + +Truncate a unsigned input to an unsigned result with saturation. + +.. code-block:: none + + %1:_(s16) = G_TRUNC_USAT_U %0:_(s32) + Type Conversions ---------------- diff --git a/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h b/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h index 25fef99699fdf..7a598bb77b356 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h @@ -763,7 +763,7 @@ class LLVM_ABI MachineIRBuilder { /// Build and insert \p Res = G_SEXT \p Op, \p Res = G_TRUNC \p Op, or /// \p Res = COPY \p Op depending on the differing sizes of \p Res and \p Op. - /// /// + /// /// \pre setBasicBlock or setMI must have been called. /// \pre \p Res must be a generic virtual register with scalar or vector type. /// \pre \p Op must be a generic virtual register with scalar or vector type. @@ -773,7 +773,7 @@ class LLVM_ABI MachineIRBuilder { /// Build and insert \p Res = G_ZEXT \p Op, \p Res = G_TRUNC \p Op, or /// \p Res = COPY \p Op depending on the differing sizes of \p Res and \p Op. - /// /// + /// /// \pre setBasicBlock or setMI must have been called. /// \pre \p Res must be a generic virtual register with scalar or vector type. /// \pre \p Op must be a generic virtual register with scalar or vector type. @@ -783,7 +783,7 @@ class LLVM_ABI MachineIRBuilder { // Build and insert \p Res = G_ANYEXT \p Op, \p Res = G_TRUNC \p Op, or /// \p Res = COPY \p Op depending on the differing sizes of \p Res and \p Op. - /// /// + /// /// \pre setBasicBlock or setMI must have been called. /// \pre \p Res must be a generic virtual register with scalar or vector type. /// \pre \p Op must be a generic virtual register with scalar or vector type. @@ -794,7 +794,7 @@ class LLVM_ABI MachineIRBuilder { /// Build and insert \p Res = \p ExtOpc, \p Res = G_TRUNC \p /// Op, or \p Res = COPY \p Op depending on the differing sizes of \p Res and /// \p Op. - /// /// + /// /// \pre setBasicBlock or setMI must have been called. /// \pre \p Res must be a generic virtual register with scalar or vector type. /// \pre \p Op must be a generic virtual register with scalar or vector type. @@ -809,6 +809,48 @@ class LLVM_ABI MachineIRBuilder { MachineInstrBuilder buildZExtInReg(const DstOp &Res, const SrcOp &Op, int64_t ImmOp); + /// Build and insert \p Res = \p G_TRUNC_SSAT_S \p Op + /// + /// G_TRUNC_SSAT_S truncates the signed input, \p Op, to a signed result with + /// saturation. + /// + /// \pre setBasicBlock or setMI must have been called. + /// \pre \p Res must be a generic virtual register with scalar or vector type. + /// \pre \p Op must be a generic virtual register with scalar or vector type. + /// + /// \return The newly created instruction. + MachineInstrBuilder buildTruncSSatS(const DstOp &Res, const SrcOp &Op) { + return buildInstr(TargetOpcode::G_TRUNC_SSAT_S, {Res}, {Op}); + } + + /// Build and insert \p Res = \p G_TRUNC_SSAT_U \p Op + /// + /// G_TRUNC_SSAT_U truncates the signed input, \p Op, to an unsigned result + /// with saturation. + /// + /// \pre setBasicBlock or setMI must have been called. + /// \pre \p Res must be a generic virtual register with scalar or vector type. + /// \pre \p Op must be a generic virtual register with scalar or vector type. + /// + /// \return The newly created instruction. + MachineInstrBuilder buildTruncSSatU(const DstOp &Res, const SrcOp &Op) { + return buildInstr(TargetOpcode::G_TRUNC_SSAT_U, {Res}, {Op}); + } + + /// Build and insert \p Res = \p G_TRUNC_USAT_U \p Op + /// + /// G_TRUNC_USAT_U truncates the unsigned input, \p Op, to an unsigned result + /// with saturation. + /// + /// \pre setBasicBlock or setMI must have been called. + /// \pre \p Res must be a generic virtual register with scalar or vector type. + /// \pre \p Op must be a generic virtual register with scalar or vector type. + /// + /// \return The newly created instruction. + MachineInstrBuilder buildTruncUSatU(const DstOp &Res, const SrcOp &Op) { + return buildInstr(TargetOpcode::G_TRUNC_USAT_U, {Res}, {Op}); + } + /// Build and insert an appropriate cast between two registers of equal size. MachineInstrBuilder buildCast(const DstOp &Dst, const SrcOp &Src); diff --git a/llvm/include/llvm/Support/TargetOpcodes.def b/llvm/include/llvm/Support/TargetOpcodes.def index 92fd60e03112a..6ba0290cc77a6 100644 --- a/llvm/include/llvm/Support/TargetOpcodes.def +++ b/llvm/include/llvm/Support/TargetOpcodes.def @@ -475,6 +475,15 @@ HANDLE_TARGET_OPCODE(G_ANYEXT) /// elements of the vector. HANDLE_TARGET_OPCODE(G_TRUNC) +/// Generic instruction to truncate a signed operand to a signed result with saturation. +HANDLE_TARGET_OPCODE(G_TRUNC_SSAT_S) + +/// Generic instruction to truncate a signed operand to an unsigned result with saturation. +HANDLE_TARGET_OPCODE(G_TRUNC_SSAT_U) + +/// Generic instruction to truncate a unsigned operand to an unsigned result with saturation. +HANDLE_TARGET_OPCODE(G_TRUNC_USAT_U) + /// Generic integer constant. HANDLE_TARGET_OPCODE(G_CONSTANT) diff --git a/llvm/include/llvm/Target/GenericOpcodes.td b/llvm/include/llvm/Target/GenericOpcodes.td index a462b07461b41..bcf49b448e782 100644 --- a/llvm/include/llvm/Target/GenericOpcodes.td +++ b/llvm/include/llvm/Target/GenericOpcodes.td @@ -86,6 +86,27 @@ def G_TRUNC : GenericInstruction { let hasSideEffects = false; } +// Truncate the signed operand to a signed result with saturation. +def G_TRUNC_SSAT_S : GenericInstruction { + let OutOperandList = (outs type0:$dst); + let InOperandList = (ins type1:$src); + let hasSideEffects = false; +} + +// Truncate the signed operand to an unsigned result with saturation. +def G_TRUNC_SSAT_U : GenericInstruction { + let OutOperandList = (outs type0:$dst); + let InOperandList = (ins type1:$src); + let hasSideEffects = false; +} + +// Truncate the unsigned operand to an unsigned result with saturation. +def G_TRUNC_USAT_U : GenericInstruction { + let OutOperandList = (outs type0:$dst); + let InOperandList = (ins type1:$src); + let hasSideEffects = false; +} + def G_IMPLICIT_DEF : GenericInstruction { let OutOperandList = (outs type0:$dst); let InOperandList = (ins); diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp index 109988246d0ab..01703fe09b79a 100644 --- a/llvm/lib/CodeGen/MachineVerifier.cpp +++ b/llvm/lib/CodeGen/MachineVerifier.cpp @@ -1424,6 +1424,9 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) { case TargetOpcode::G_ZEXT: case TargetOpcode::G_ANYEXT: case TargetOpcode::G_TRUNC: + case TargetOpcode::G_TRUNC_SSAT_S: + case TargetOpcode::G_TRUNC_SSAT_U: + case TargetOpcode::G_TRUNC_USAT_U: case TargetOpcode::G_FPEXT: case TargetOpcode::G_FPTRUNC: { // Number of operands and presense of types is already checked (and @@ -1450,6 +1453,9 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) { report("Generic extend has destination type no larger than source", MI); break; case TargetOpcode::G_TRUNC: + case TargetOpcode::G_TRUNC_SSAT_S: + case TargetOpcode::G_TRUNC_SSAT_U: + case TargetOpcode::G_TRUNC_USAT_U: case TargetOpcode::G_FPTRUNC: if (DstSize >= SrcSize) report("Generic truncate has destination type no smaller than source", diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir index a96ef2a0faab3..d0424f2e400fc 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir +++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir @@ -319,6 +319,15 @@ # DEBUG-NEXT: G_TRUNC (opcode {{[0-9]+}}): 2 type indices, 0 imm indices # DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected # DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_TRUNC_SSAT_S (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: G_TRUNC_SSAT_U (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: G_TRUNC_USAT_U (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined # DEBUG-NEXT: G_CONSTANT (opcode {{[0-9]+}}): 1 type index, 0 imm indices # DEBUG-NEXT: .. the first uncovered type index: 1, OK # DEBUG-NEXT: .. the first uncovered imm index: 0, OK diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer-info-validation.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer-info-validation.mir index d41d3f76436cc..30e455f57737b 100644 --- a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer-info-validation.mir +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer-info-validation.mir @@ -315,6 +315,15 @@ # DEBUG-NEXT: G_TRUNC (opcode {{[0-9]+}}): 2 type indices, 0 imm indices # DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined # DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: G_TRUNC_SSAT_S (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: G_TRUNC_SSAT_U (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: G_TRUNC_USAT_U (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined # DEBUG-NEXT: G_CONSTANT (opcode {{[0-9]+}}): 1 type index, 0 imm indices # DEBUG-NEXT: .. the first uncovered type index: 1, OK # DEBUG-NEXT: .. the first uncovered imm index: 0, OK diff --git a/llvm/test/MC/ELF/mc-dump.s b/llvm/test/MC/ELF/mc-dump.s index 3788eb093eef2..389941db23e3b 100644 --- a/llvm/test/MC/ELF/mc-dump.s +++ b/llvm/test/MC/ELF/mc-dump.s @@ -12,7 +12,7 @@ # CHECK-NEXT:0 Data Size:0 [] # CHECK-NEXT: Symbol @0 _start # CHECK-NEXT:0 Org Offset:3 Value:0 -# CHECK-NEXT:3 Relaxable Size:2 > +# CHECK-NEXT:3 Relaxable Size:2 > # CHECK-NEXT: Fixup @1 Value:.Ltmp0 Kind:4001 # CHECK-NEXT:5 Data Size:16 [48,8b,04,25,00,00,00,00,48,8b,04,25,00,00,00,00] # CHECK-NEXT: Fixup @4 Value:f0@ Kind:4017 diff --git a/llvm/test/TableGen/GlobalISelCombinerEmitter/match-table-cxx.td b/llvm/test/TableGen/GlobalISelCombinerEmitter/match-table-cxx.td index dfb2c173f2c88..ce4f0108b4843 100644 --- a/llvm/test/TableGen/GlobalISelCombinerEmitter/match-table-cxx.td +++ b/llvm/test/TableGen/GlobalISelCombinerEmitter/match-table-cxx.td @@ -96,71 +96,71 @@ def MyCombiner: GICombiner<"GenMyCombiner", [ // CHECK: const uint8_t *GenMyCombiner::getMatchTable() const { // CHECK-NEXT: constexpr static uint8_t MatchTable0[] = { -// CHECK-NEXT: /* 0 */ GIM_SwitchOpcode, /*MI*/0, /*[*/GIMT_Encode2(99), GIMT_Encode2(207), /*)*//*default:*//*Label 5*/ GIMT_Encode4(508), -// CHECK-NEXT: /* 10 */ /*TargetOpcode::G_STORE*//*Label 0*/ GIMT_Encode4(442), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), -// CHECK-NEXT: /* 170 */ /*TargetOpcode::G_SEXT*//*Label 1*/ GIMT_Encode4(460), GIMT_Encode4(0), -// CHECK-NEXT: /* 178 */ /*TargetOpcode::G_ZEXT*//*Label 2*/ GIMT_Encode4(472), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), -// CHECK-NEXT: /* 402 */ /*TargetOpcode::G_FNEG*//*Label 3*/ GIMT_Encode4(484), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), -// CHECK-NEXT: /* 438 */ /*TargetOpcode::G_FABS*//*Label 4*/ GIMT_Encode4(496), -// CHECK-NEXT: /* 442 */ // Label 0: @442 -// CHECK-NEXT: /* 442 */ GIM_Try, /*On fail goto*//*Label 6*/ GIMT_Encode4(459), // Rule ID 2 // -// CHECK-NEXT: /* 447 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule2Enabled), -// CHECK-NEXT: /* 450 */ // MIs[0] x -// CHECK-NEXT: /* 450 */ // No operand predicates -// CHECK-NEXT: /* 450 */ // MIs[0] y -// CHECK-NEXT: /* 450 */ // No operand predicates -// CHECK-NEXT: /* 450 */ GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner0), -// CHECK-NEXT: /* 454 */ GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner1), -// CHECK-NEXT: /* 458 */ // Combiner Rule #2: TwoMatchNoApply -// CHECK-NEXT: /* 458 */ GIR_EraseRootFromParent_Done, -// CHECK-NEXT: /* 459 */ // Label 6: @459 -// CHECK-NEXT: /* 459 */ GIM_Reject, -// CHECK-NEXT: /* 460 */ // Label 1: @460 -// CHECK-NEXT: /* 460 */ GIM_Try, /*On fail goto*//*Label 7*/ GIMT_Encode4(471), // Rule ID 3 // -// CHECK-NEXT: /* 465 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule3Enabled), -// CHECK-NEXT: /* 468 */ // MIs[0] a -// CHECK-NEXT: /* 468 */ // No operand predicates -// CHECK-NEXT: /* 468 */ // MIs[0] y -// CHECK-NEXT: /* 468 */ // No operand predicates -// CHECK-NEXT: /* 468 */ // Combiner Rule #3: NoMatchTwoApply -// CHECK-NEXT: /* 468 */ GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner2), -// CHECK-NEXT: /* 471 */ // Label 7: @471 +// CHECK-NEXT: /* 0 */ GIM_SwitchOpcode, /*MI*/0, /*[*/GIMT_Encode2(99), GIMT_Encode2(210), /*)*//*default:*//*Label 5*/ GIMT_Encode4(520), +// CHECK-NEXT: /* 10 */ /*TargetOpcode::G_STORE*//*Label 0*/ GIMT_Encode4(454), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), +// CHECK-NEXT: /* 182 */ /*TargetOpcode::G_SEXT*//*Label 1*/ GIMT_Encode4(472), GIMT_Encode4(0), +// CHECK-NEXT: /* 190 */ /*TargetOpcode::G_ZEXT*//*Label 2*/ GIMT_Encode4(484), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), +// CHECK-NEXT: /* 414 */ /*TargetOpcode::G_FNEG*//*Label 3*/ GIMT_Encode4(496), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), GIMT_Encode4(0), +// CHECK-NEXT: /* 450 */ /*TargetOpcode::G_FABS*//*Label 4*/ GIMT_Encode4(508), +// CHECK-NEXT: /* 454 */ // Label 0: @454 +// CHECK-NEXT: /* 454 */ GIM_Try, /*On fail goto*//*Label 6*/ GIMT_Encode4(471), // Rule ID 2 // +// CHECK-NEXT: /* 459 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule2Enabled), +// CHECK-NEXT: /* 462 */ // MIs[0] x +// CHECK-NEXT: /* 462 */ // No operand predicates +// CHECK-NEXT: /* 462 */ // MIs[0] y +// CHECK-NEXT: /* 462 */ // No operand predicates +// CHECK-NEXT: /* 462 */ GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner0), +// CHECK-NEXT: /* 466 */ GIM_CheckCxxInsnPredicate, /*MI*/0, /*FnId*/GIMT_Encode2(GICXXPred_MI_Predicate_GICombiner1), +// CHECK-NEXT: /* 470 */ // Combiner Rule #2: TwoMatchNoApply +// CHECK-NEXT: /* 470 */ GIR_EraseRootFromParent_Done, +// CHECK-NEXT: /* 471 */ // Label 6: @471 // CHECK-NEXT: /* 471 */ GIM_Reject, -// CHECK-NEXT: /* 472 */ // Label 2: @472 -// CHECK-NEXT: /* 472 */ GIM_Try, /*On fail goto*//*Label 8*/ GIMT_Encode4(483), // Rule ID 4 // -// CHECK-NEXT: /* 477 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule4Enabled), -// CHECK-NEXT: /* 480 */ // MIs[0] a -// CHECK-NEXT: /* 480 */ // No operand predicates -// CHECK-NEXT: /* 480 */ // MIs[0] y -// CHECK-NEXT: /* 480 */ // No operand predicates -// CHECK-NEXT: /* 480 */ // Combiner Rule #4: CombineCXXOrder -// CHECK-NEXT: /* 480 */ GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner3), -// CHECK-NEXT: /* 483 */ // Label 8: @483 +// CHECK-NEXT: /* 472 */ // Label 1: @472 +// CHECK-NEXT: /* 472 */ GIM_Try, /*On fail goto*//*Label 7*/ GIMT_Encode4(483), // Rule ID 3 // +// CHECK-NEXT: /* 477 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule3Enabled), +// CHECK-NEXT: /* 480 */ // MIs[0] a +// CHECK-NEXT: /* 480 */ // No operand predicates +// CHECK-NEXT: /* 480 */ // MIs[0] y +// CHECK-NEXT: /* 480 */ // No operand predicates +// CHECK-NEXT: /* 480 */ // Combiner Rule #3: NoMatchTwoApply +// CHECK-NEXT: /* 480 */ GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner2), +// CHECK-NEXT: /* 483 */ // Label 7: @483 // CHECK-NEXT: /* 483 */ GIM_Reject, -// CHECK-NEXT: /* 484 */ // Label 3: @484 -// CHECK-NEXT: /* 484 */ GIM_Try, /*On fail goto*//*Label 9*/ GIMT_Encode4(495), // Rule ID 1 // -// CHECK-NEXT: /* 489 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule1Enabled), -// CHECK-NEXT: /* 492 */ // MIs[0] a -// CHECK-NEXT: /* 492 */ // No operand predicates -// CHECK-NEXT: /* 492 */ // MIs[0] b -// CHECK-NEXT: /* 492 */ // No operand predicates -// CHECK-NEXT: /* 492 */ // Combiner Rule #1: TwoMatchTwoApply -// CHECK-NEXT: /* 492 */ GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner1), -// CHECK-NEXT: /* 495 */ // Label 9: @495 +// CHECK-NEXT: /* 484 */ // Label 2: @484 +// CHECK-NEXT: /* 484 */ GIM_Try, /*On fail goto*//*Label 8*/ GIMT_Encode4(495), // Rule ID 4 // +// CHECK-NEXT: /* 489 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule4Enabled), +// CHECK-NEXT: /* 492 */ // MIs[0] a +// CHECK-NEXT: /* 492 */ // No operand predicates +// CHECK-NEXT: /* 492 */ // MIs[0] y +// CHECK-NEXT: /* 492 */ // No operand predicates +// CHECK-NEXT: /* 492 */ // Combiner Rule #4: CombineCXXOrder +// CHECK-NEXT: /* 492 */ GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner3), +// CHECK-NEXT: /* 495 */ // Label 8: @495 // CHECK-NEXT: /* 495 */ GIM_Reject, -// CHECK-NEXT: /* 496 */ // Label 4: @496 -// CHECK-NEXT: /* 496 */ GIM_Try, /*On fail goto*//*Label 10*/ GIMT_Encode4(507), // Rule ID 0 // -// CHECK-NEXT: /* 501 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule0Enabled), -// CHECK-NEXT: /* 504 */ // MIs[0] a -// CHECK-NEXT: /* 504 */ // No operand predicates -// CHECK-NEXT: /* 504 */ // MIs[0] b -// CHECK-NEXT: /* 504 */ // No operand predicates -// CHECK-NEXT: /* 504 */ // Combiner Rule #0: OneMatchOneApply -// CHECK-NEXT: /* 504 */ GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner0), -// CHECK-NEXT: /* 507 */ // Label 10: @507 +// CHECK-NEXT: /* 496 */ // Label 3: @496 +// CHECK-NEXT: /* 496 */ GIM_Try, /*On fail goto*//*Label 9*/ GIMT_Encode4(507), // Rule ID 1 // +// CHECK-NEXT: /* 501 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule1Enabled), +// CHECK-NEXT: /* 504 */ // MIs[0] a +// CHECK-NEXT: /* 504 */ // No operand predicates +// CHECK-NEXT: /* 504 */ // MIs[0] b +// CHECK-NEXT: /* 504 */ // No operand predicates +// CHECK-NEXT: /* 504 */ // Combiner Rule #1: TwoMatchTwoApply +// CHECK-NEXT: /* 504 */ GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner1), +// CHECK-NEXT: /* 507 */ // Label 9: @507 // CHECK-NEXT: /* 507 */ GIM_Reject, -// CHECK-NEXT: /* 508 */ // Label 5: @508 -// CHECK-NEXT: /* 508 */ GIM_Reject, -// CHECK-NEXT: /* 509 */ }; // Size: 509 bytes +// CHECK-NEXT: /* 508 */ // Label 4: @508 +// CHECK-NEXT: /* 508 */ GIM_Try, /*On fail goto*//*Label 10*/ GIMT_Encode4(519), // Rule ID 0 // +// CHECK-NEXT: /* 513 */ GIM_CheckSimplePredicate, GIMT_Encode2(GICXXPred_Simple_IsRule0Enabled), +// CHECK-NEXT: /* 516 */ // MIs[0] a +// CHECK-NEXT: /* 516 */ // No operand predicates +// CHECK-NEXT: /* 516 */ // MIs[0] b +// CHECK-NEXT: /* 516 */ // No operand predicates +// CHECK-NEXT: /* 516 */ // Combiner Rule #0: OneMatchOneApply +// CHECK-NEXT: /* 516 */ GIR_DoneWithCustomAction, /*Fn*/GIMT_Encode2(GICXXCustomAction_GICombiner0), +// CHECK-NEXT: /* 519 */ // Label 10: @519 +// CHECK-NEXT: /* 519 */ GIM_Reject, +// CHECK-NEXT: /* 520 */ // Label 5: @520 +// CHECK-NEXT: /* 520 */ GIM_Reject, +// CHECK-NEXT: /* 521 */ }; // Size: 521 bytes // CHECK-NEXT: return MatchTable0; // CHECK-NEXT: } diff --git a/llvm/test/TableGen/GlobalISelEmitter/GlobalISelEmitter.td b/llvm/test/TableGen/GlobalISelEmitter/GlobalISelEmitter.td index 6e5d7de0732f0..e9c2069fdbd98 100644 --- a/llvm/test/TableGen/GlobalISelEmitter/GlobalISelEmitter.td +++ b/llvm/test/TableGen/GlobalISelEmitter/GlobalISelEmitter.td @@ -535,7 +535,7 @@ def : Pat<(frag GPR32:$src1, complex:$src2, complex:$src3), // R00O-NEXT: GIM_Reject, // R00O: // Label [[DEFAULT_NUM]]: @[[DEFAULT]] // R00O-NEXT: GIM_Reject, -// R00O-NEXT: }; // Size: 1878 bytes +// R00O-NEXT: }; // Size: 1890 bytes def INSNBOB : I<(outs GPR32:$dst), (ins GPR32:$src1, GPR32:$src2, GPR32:$src3, GPR32:$src4), [(set GPR32:$dst,