Skip to content

Commit

Permalink
[X86] Prefer VEX encoding in X86 assembler.
Browse files Browse the repository at this point in the history
This patch is to order the AVX instructions ahead of AVX512 instructions
in the matching table so that the AVX instructions can be matched first.
Thanks Craig and Shengchen for the idea.

Differential Revision: https://reviews.llvm.org/D111538
  • Loading branch information
LuoYuanke committed Oct 18, 2021
1 parent 239b4d6 commit 942536a
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 18 deletions.
5 changes: 5 additions & 0 deletions llvm/include/llvm/Target/Target.td
Expand Up @@ -653,6 +653,11 @@ class Instruction : InstructionEncoding {
/// instruction selection predicates. FastISel cannot handle such cases, but
/// SelectionDAG can.
bit FastISelShouldIgnore = false;

/// HasPositionOrder: Indicate tablegen to sort the instructions by record
/// ID, so that instruction that is defined earlier can be sorted earlier
/// in the assembly matching table.
bit HasPositionOrder = false;
}

/// Defines an additional encoding that disassembles to the given instruction
Expand Down
18 changes: 0 additions & 18 deletions llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
Expand Up @@ -4270,24 +4270,6 @@ unsigned X86AsmParser::checkTargetMatchPredicate(MCInst &Inst) {
ForcedVEXEncoding != VEXEncoding_VEX3))
return Match_Unsupported;

// These instructions match ambiguously with their VEX encoded counterparts
// and appear first in the matching table. Reject them unless we're forcing
// EVEX encoding.
// FIXME: We really need a way to break the ambiguity.
switch (Opc) {
case X86::VCVTSD2SIZrm_Int:
case X86::VCVTSD2SI64Zrm_Int:
case X86::VCVTSS2SIZrm_Int:
case X86::VCVTSS2SI64Zrm_Int:
case X86::VCVTTSD2SIZrm: case X86::VCVTTSD2SIZrm_Int:
case X86::VCVTTSD2SI64Zrm: case X86::VCVTTSD2SI64Zrm_Int:
case X86::VCVTTSS2SIZrm: case X86::VCVTTSS2SIZrm_Int:
case X86::VCVTTSS2SI64Zrm: case X86::VCVTTSS2SI64Zrm_Int:
if (ForcedVEXEncoding != VEXEncoding_EVEX)
return Match_Unsupported;
break;
}

return Match_Success;
}

Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/Target/X86/X86InstrFormats.td
Expand Up @@ -296,6 +296,8 @@ class X86Inst<bits<8> opcod, Format f, ImmType i, dag outs, dag ins,
// If this is a pseudo instruction, mark it isCodeGenOnly.
let isCodeGenOnly = !eq(!cast<string>(f), "Pseudo");

let HasPositionOrder = 1;

//
// Attributes specific to X86 instructions...
//
Expand Down
9 changes: 9 additions & 0 deletions llvm/utils/TableGen/AsmMatcherEmitter.cpp
Expand Up @@ -636,6 +636,15 @@ struct MatchableInfo {
if (RequiredFeatures.size() != RHS.RequiredFeatures.size())
return RequiredFeatures.size() > RHS.RequiredFeatures.size();

// For X86 AVX/AVX512 instructions, we prefer vex encoding because the
// vex encoding size is smaller. Since X86InstrSSE.td is included ahead
// of X86InstrAVX512.td, the AVX instruction ID is less than AVX512 ID.
// We use the ID to sort AVX instruction before AVX512 instruction in
// matching table.
if (TheDef->isSubClassOf("Instruction") &&
TheDef->getValueAsBit("HasPositionOrder"))
return TheDef->getID() < RHS.TheDef->getID();

return false;
}

Expand Down

0 comments on commit 942536a

Please sign in to comment.