-
Notifications
You must be signed in to change notification settings - Fork 13.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[RISCV] Use MnemonicAlias instead of InstAlias for some vector instructions. NFC #131732
Conversation
…ctions. NFC To make this work we have to apply mnemonic aliases before looking up custom operand parsing.
@llvm/pr-subscribers-backend-risc-v Author: Craig Topper (topperc) ChangesTo make this work we have to apply mnemonic aliases before looking up custom operand parsing. Full diff: https://github.com/llvm/llvm-project/pull/131732.diff 2 Files Affected:
diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
index 9a345a65c055b..884462fba234f 100644
--- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
+++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
@@ -2881,6 +2881,14 @@ bool RISCVAsmParser::parseInstruction(ParseInstructionInfo &Info,
}
}
+ // Apply mnemonic aliases because the destination mnemonic may have require
+ // custom operand parsing. The generic tblgen'erated code does this later, at
+ // the start of MatchInstructionImpl(), but that's too late for custom
+ // operand parsing.
+ const FeatureBitset &AvailableFeatures = getAvailableFeatures();
+ unsigned AssemblerDialect = getParser().getAssemblerDialect();
+ applyMnemonicAliases(Name, AvailableFeatures, AssemblerDialect);
+
// First operand is token for instruction
Operands.push_back(RISCVOperand::createToken(Name, NameLoc));
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td
index 402e8163b8527..d571394ad65ed 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td
@@ -1111,10 +1111,8 @@ def VLM_V : VUnitStrideLoadMask<"vlm.v">,
Sched<[WriteVLDM_WorstCase, ReadVLDX]>;
def VSM_V : VUnitStrideStoreMask<"vsm.v">,
Sched<[WriteVSTM_WorstCase, ReadVSTM_WorstCase, ReadVSTX]>;
-def : InstAlias<"vle1.v $vd,$rs1",
- (VLM_V VR:$vd, GPRMemZeroOffset:$rs1), 0>;
-def : InstAlias<"vse1.v $vs3, $rs1",
- (VSM_V VR:$vs3, GPRMemZeroOffset:$rs1), 0>;
+def : MnemonicAlias<"vle1.v", "vlm.v">;
+def : MnemonicAlias<"vse1.v", "vsm.v">;
def VS1R_V : VWholeStore<0, "vs1r.v", VR>,
Sched<[WriteVST1R, ReadVST1R, ReadVSTX]>;
@@ -1582,8 +1580,7 @@ defm VFREDMIN : VREDMINMAX_FV_V<"vfredmin", 0b000101>;
}
} // RVVConstraint = NoConstraint, ElementsDependOn = EltDepsVLMask
-def : InstAlias<"vfredsum.vs $vd, $vs2, $vs1$vm",
- (VFREDUSUM_VS VR:$vd, VR:$vs2, VR:$vs1, VMaskOp:$vm), 0>;
+def : MnemonicAlias<"vfredsum.vs", "vfredusum.vs">;
// Vector Widening Floating-Point Reduction Instructions
let Constraints = "@earlyclobber $vd", RVVConstraint = NoConstraint, ElementsDependOn = EltDepsVLMask, DestEEW = EEWSEWx2 in {
@@ -1597,8 +1594,7 @@ defm VFWREDUSUM : VWRED_FV_V<"vfwredusum", 0b110001>;
}
} // Constraints = "@earlyclobber $vd", RVVConstraint = NoConstraint, ElementsDependOn = EltDepsVLMask, DestEEW = EEWSEWx2
-def : InstAlias<"vfwredsum.vs $vd, $vs2, $vs1$vm",
- (VFWREDUSUM_VS VR:$vd, VR:$vs2, VR:$vs1, VMaskOp:$vm), 0>;
+def : MnemonicAlias<"vfwredsum.vs", "vfwredusum.vs">;
} // Predicates = [HasVInstructionsAnyF]
let Predicates = [HasVInstructions] in {
@@ -1623,10 +1619,8 @@ def : InstAlias<"vmset.m $vd",
def : InstAlias<"vmnot.m $vd, $vs",
(VMNAND_MM VR:$vd, VR:$vs, VR:$vs)>;
-def : InstAlias<"vmandnot.mm $vd, $vs2, $vs1",
- (VMANDN_MM VR:$vd, VR:$vs2, VR:$vs1), 0>;
-def : InstAlias<"vmornot.mm $vd, $vs2, $vs1",
- (VMORN_MM VR:$vd, VR:$vs2, VR:$vs1), 0>;
+def : MnemonicAlias<"vmandnot.mm", "vmandn.mm">;
+def : MnemonicAlias<"vmornot.mm", "vmorn.mm">;
let hasSideEffects = 0, mayLoad = 0, mayStore = 0,
RVVConstraint = NoConstraint, ElementsDependOn = EltDepsVLMask in {
@@ -1645,8 +1639,7 @@ def VFIRST_M : RVInstV<0b010000, 0b10001, OPMVV, (outs GPR:$vd),
} // hasSideEffects = 0, mayLoad = 0, mayStore = 0, RVVConstraint = NoConstraint, ElementsDependOn = EltDepsVLMask
-def : InstAlias<"vpopc.m $vd, $vs2$vm",
- (VCPOP_M GPR:$vd, VR:$vs2, VMaskOp:$vm), 0>;
+def : MnemonicAlias<"vpopc.m", "vcpop.m">;
let Constraints = "@earlyclobber $vd", RVVConstraint = Iota, ElementsDependOn = EltDepsVLMask in {
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
@@ -2881,6 +2881,14 @@ bool RISCVAsmParser::parseInstruction(ParseInstructionInfo &Info, | |||
} | |||
} | |||
|
|||
// Apply mnemonic aliases because the destination mnemonic may have require |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Have you looked at whether we can switch the order in the generic generated code? (non blocking, just a cleanup item)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There are two generated functions involved here, MatchOperandParserImpl
and MatchInstructionImpl
. They are called separately by RISCVAsmParser.cpp. I could add a a call to applyMnemonicAliases
inside MatchOperandParserImpl
, but I wouldn't be able to remove the call inside ``MatchInstructionImpl`
To make this work we have to apply mnemonic aliases before looking up custom operand parsing.