From 6c570f789dc827960f3b8f6acddf0a07a7746673 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Sat, 16 May 2020 10:41:35 -0400 Subject: [PATCH] GlobalISel: Add G_EXTRACT/G_INSERT offset to legalize info Immediate legalize fields were added for G_SEXT_INREG. Simiarly, these are likely not legal except for certain offsets. --- llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h | 15 +++++++++++++++ llvm/include/llvm/Target/GenericOpcodes.td | 4 ++-- .../AArch64/GlobalISel/legalizer-info-validation.mir | 4 ++-- llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp | 2 +- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h b/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h index 49bc66a..b3c7b68 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h @@ -459,6 +459,14 @@ class LegalizeRuleSet { immIdx(0); // Inform verifier imm idx 0 is handled. return actionIf(Action, typeInSet(typeIdx(0), Types)); } + + LegalizeRuleSet &actionForTypeWithAnyImm( + LegalizeAction Action, std::initializer_list> Types) { + using namespace LegalityPredicates; + immIdx(0); // Inform verifier imm idx 0 is handled. + return actionIf(Action, typePairInSet(typeIdx(0), typeIdx(1), Types)); + } + /// Use the given action when type indexes 0 and 1 are both in the given list. /// That is, the type pair is in the cartesian product of the list. /// Action should not be an action that requires mutation. @@ -528,6 +536,13 @@ public: markAllIdxsAsCovered(); return actionForTypeWithAnyImm(LegalizeAction::Legal, Types); } + + LegalizeRuleSet &legalForTypeWithAnyImm( + std::initializer_list> Types) { + markAllIdxsAsCovered(); + return actionForTypeWithAnyImm(LegalizeAction::Legal, Types); + } + /// The instruction is legal when type indexes 0 and 1 along with the memory /// size and minimum alignment is any type and size tuple in the given list. LegalizeRuleSet &legalForTypesWithMemDesc( diff --git a/llvm/include/llvm/Target/GenericOpcodes.td b/llvm/include/llvm/Target/GenericOpcodes.td index 79b965e..eafcb3d 100644 --- a/llvm/include/llvm/Target/GenericOpcodes.td +++ b/llvm/include/llvm/Target/GenericOpcodes.td @@ -974,7 +974,7 @@ def G_FENCE : GenericInstruction { // register banks have been selected. def G_EXTRACT : GenericInstruction { let OutOperandList = (outs type0:$res); - let InOperandList = (ins type1:$src, unknown:$offset); + let InOperandList = (ins type1:$src, untyped_imm_0:$offset); let hasSideEffects = 0; } @@ -993,7 +993,7 @@ def G_UNMERGE_VALUES : GenericInstruction { // Insert a smaller register into a larger one at the specified bit-index. def G_INSERT : GenericInstruction { let OutOperandList = (outs type0:$dst); - let InOperandList = (ins type0:$src, type1:$op, unknown:$offset); + let InOperandList = (ins type0:$src, type1:$op, untyped_imm_0:$offset); let hasSideEffects = 0; } diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir index 7691441..35b41b8 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir +++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir @@ -76,7 +76,7 @@ # 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_EXTRACT (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: G_EXTRACT (opcode {{[0-9]+}}): 2 type indices, 1 imm index # DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected # DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected # @@ -84,7 +84,7 @@ # 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_INSERT (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: G_INSERT (opcode {{[0-9]+}}): 2 type indices, 1 imm index # DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected # DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected # diff --git a/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp b/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp index 817d707..93f4f70 100644 --- a/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp +++ b/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp @@ -2311,7 +2311,7 @@ TEST_F(AArch64GISelMITest, NarrowScalarExtract) { // Declare your legalization info DefineLegalizerInfo(A, { getActionDefinitionsBuilder(G_UNMERGE_VALUES).legalFor({{s32, s64}}); - getActionDefinitionsBuilder(G_EXTRACT).legalFor({{s16, s32}}); + getActionDefinitionsBuilder(G_EXTRACT).legalForTypeWithAnyImm({{s16, s32}}); }); LLT S16{LLT::scalar(16)}; -- 2.7.4