[llvm] 81b10f8 - [X86][tablgen] Consider the mnemonic when auto-generating memory folding table
Shengchen Kan via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 5 21:53:11 PDT 2022
Author: Shengchen Kan
Date: 2022-04-06T12:53:05+08:00
New Revision: 81b10f8200ae65d3e54b3899cdaa25ea59938148
URL: https://github.com/llvm/llvm-project/commit/81b10f8200ae65d3e54b3899cdaa25ea59938148
DIFF: https://github.com/llvm/llvm-project/commit/81b10f8200ae65d3e54b3899cdaa25ea59938148.diff
LOG: [X86][tablgen] Consider the mnemonic when auto-generating memory folding table
Intuitively, the memory folding pair should have the same mnemonic.
This patch removes
```
{X86::SENDUIPI,X86::VMXON}
```
in the auto-generated table.
And `NotMemoryFoldable` for `TPAUSE` and `CLWB` can be saved.
```
{X86::MOVLHPSrr,X86::MOVHPSrm}
{X86::VMOVLHPSZrr,X86::VMOVHPSZ128rm}
{X86::VMOVLHPSrr,X86::VMOVHPSrm}
```
It seems the three pairs above are mistakenly killed.
But we can add them back manually later.
Reviewed By: Amir
Differential Revision: https://reviews.llvm.org/D122477
Added:
Modified:
llvm/lib/Target/X86/CMakeLists.txt
llvm/lib/Target/X86/X86InstrInfo.td
llvm/utils/TableGen/X86FoldTablesEmitter.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/CMakeLists.txt b/llvm/lib/Target/X86/CMakeLists.txt
index 1438da0a457b8..5a1d04e2d8356 100644
--- a/llvm/lib/Target/X86/CMakeLists.txt
+++ b/llvm/lib/Target/X86/CMakeLists.txt
@@ -19,7 +19,7 @@ tablegen(LLVM X86GenRegisterInfo.inc -gen-register-info)
tablegen(LLVM X86GenSubtargetInfo.inc -gen-subtarget)
if (X86_GEN_FOLD_TABLES)
- tablegen(LLVM X86GenFoldTables.inc -gen-x86-fold-tables)
+ tablegen(LLVM X86GenFoldTables.inc -gen-x86-fold-tables -asmwriternum=1)
endif()
add_public_tablegen_target(X86CommonTableGen)
diff --git a/llvm/lib/Target/X86/X86InstrInfo.td b/llvm/lib/Target/X86/X86InstrInfo.td
index 50626cf279f36..bc0dccf99f0dc 100644
--- a/llvm/lib/Target/X86/X86InstrInfo.td
+++ b/llvm/lib/Target/X86/X86InstrInfo.td
@@ -2851,7 +2851,7 @@ let SchedRW = [WriteSystem] in {
def TPAUSE : I<0xAE, MRM6r,
(outs), (ins GR32orGR64:$src), "tpause\t$src",
[(set EFLAGS, (X86tpause GR32orGR64:$src, EDX, EAX))]>,
- PD, Requires<[HasWAITPKG]>, NotMemoryFoldable;
+ PD, Requires<[HasWAITPKG]>;
}
} // SchedRW
@@ -3124,7 +3124,7 @@ def CLFLUSHOPT : I<0xAE, MRM7m, (outs), (ins i8mem:$src),
let Predicates = [HasCLWB], SchedRW = [WriteLoad] in
def CLWB : I<0xAE, MRM6m, (outs), (ins i8mem:$src), "clwb\t$src",
- [(int_x86_clwb addr:$src)]>, PD, NotMemoryFoldable;
+ [(int_x86_clwb addr:$src)]>, PD;
let Predicates = [HasCLDEMOTE], SchedRW = [WriteLoad] in
def CLDEMOTE : I<0x1C, MRM0m, (outs), (ins i8mem:$src), "cldemote\t$src",
diff --git a/llvm/utils/TableGen/X86FoldTablesEmitter.cpp b/llvm/utils/TableGen/X86FoldTablesEmitter.cpp
index 5f6e983f608c0..f54e17c9b36af 100644
--- a/llvm/utils/TableGen/X86FoldTablesEmitter.cpp
+++ b/llvm/utils/TableGen/X86FoldTablesEmitter.cpp
@@ -252,10 +252,11 @@ getAltRegInst(const CodeGenInstruction *I, const RecordKeeper &Records,
// matches the EVEX instruction of this object.
class IsMatch {
const CodeGenInstruction *MemInst;
+ unsigned Variant;
public:
- IsMatch(const CodeGenInstruction *Inst, const RecordKeeper &Records)
- : MemInst(Inst) {}
+ IsMatch(const CodeGenInstruction *Inst, unsigned V)
+ : MemInst(Inst), Variant(V) {}
bool operator()(const CodeGenInstruction *RegInst) {
X86Disassembler::RecognizableInstrBase RegRI(*RegInst);
@@ -272,6 +273,16 @@ class IsMatch {
if (!areOppositeForms(RegRI.Form, MemRI.Form))
return false;
+ // X86 encoding is crazy, e.g
+ //
+ // f3 0f c7 30 vmxon (%rax)
+ // f3 0f c7 f0 senduipi %rax
+ //
+ // This two instruction have similiar encoding fields but are unrelated
+ if (X86Disassembler::getMnemonic(MemInst, Variant) !=
+ X86Disassembler::getMnemonic(RegInst, Variant))
+ return false;
+
// Return false if one (at least) of the encoding fields of both
// instructions do not match.
if (RegRI.Encoding != MemRI.Encoding || RegRI.Opcode != MemRI.Opcode ||
@@ -533,6 +544,8 @@ void X86FoldTablesEmitter::run(formatted_raw_ostream &OS) {
}
}
+ Record *AsmWriter = Target.getAsmWriter();
+ unsigned Variant = AsmWriter->getValueAsInt("Variant");
// For each memory form instruction, try to find its register form
// instruction.
for (const CodeGenInstruction *MemInst : MemInsts) {
@@ -548,7 +561,7 @@ void X86FoldTablesEmitter::run(formatted_raw_ostream &OS) {
// opcode.
std::vector<const CodeGenInstruction *> &OpcRegInsts = RegInstsIt->second;
- auto Match = find_if(OpcRegInsts, IsMatch(MemInst, Records));
+ auto Match = find_if(OpcRegInsts, IsMatch(MemInst, Variant));
if (Match != OpcRegInsts.end()) {
const CodeGenInstruction *RegInst = *Match;
// If the matched instruction has it's "FoldGenRegForm" set, map the
More information about the llvm-commits
mailing list