[PATCH] D53134: [tblgen][llvm-mca] Add the ability to describe move elimination candidates via tablegen.

Andrea Di Biagio via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 11 05:26:16 PDT 2018


andreadb created this revision.
andreadb added reviewers: RKSimon, mattd, craig.topper, courbet, atrick, lebedev.ri.
Herald added subscribers: gbedwell, tschuett.

This patch adds the ability to identify instructions that are "move elimination candidates". It also allows scheduling models to describe processor register files that allow move elimination.

A move elimination candidate is an instruction that can be eliminated at register renaming stage.
Each subtarget can specify which instructions are move elimination candidates with the help of tablegen class "IsOptimizableMoveFunction" (see llvm/Target/TargetInstrPredicate.td).

For example, on X86, BtVer2 allows MMX/SSE moves to be eliminated only if source and destination are not the same register. The definition of 'IsOptimizableMoveFunction' for BtVer2 looks like this:

  def : IsOptimizableMoveFunction<[
    InstructionEquivalenceClass<[
      // MMX variants.
      MMX_MOVQ64rr,
  
      // SSE variants.
      MOVAPSrr, MOVUPSrr,
      MOVAPDrr, MOVUPDrr,
      MOVDQArr, MOVDQUrr,
  
      // AVX variants.
      VMOVAPSrr, VMOVUPSrr,
      VMOVAPDrr, VMOVUPDrr,
      VMOVDQArr, VMOVDQUrr
    ], CheckNot<CheckSameRegOperand<0, 1>> >
  ]>;

Definitions of `IsOptimizableMoveFunction` from different processors of a same Target are used by the SubtargetEmitter to auto-generate target-specific overrides for the following predicate methods:

  bool TargetSubtargetInfo::isOptimizableRegisterMove(const MachineInstr *MI) const;
  bool MCInstrAnalysis::isOptimizableRegisterMove(const MCInst &MI, unsigned CPUID) const;

By default, those methods return false (i.e. no move elimination is allowed by the subtarget).

Tablegen class RegisterFile has been extended with the following information:

- The set of register classes that allow move elimination.
- Maxium number of moves that can be eliminated every cycle.
- Whether move elimination is restricted to moves from registers that are known to be zero.

-

This patch is structured in three part:

A first part (which is mostly boilerplate) adds the new 'isOptimizableRegisterMove' target hooks, and extends existing register file descriptors in MC by introducing new fields to describe properties related to move elimination.

A second part, uses the new tablegen constructs to describe move elimination in the BtVer2 scheduling model.

A third part, teaches llm-mca how to query the new 'isOptimizableRegisterMove' hook to mark instructions that are candidates for move elimination. It also teaches class RegisterFile how to describe constraints on move elimination at PRF granularity.

llvm-mca tests for btver2 show differences before/after this patch.

Please let me know if okay to commit.

Thanks,
Andrea


https://reviews.llvm.org/D53134

Files:
  include/llvm/CodeGen/TargetSubtargetInfo.h
  include/llvm/MC/MCInstrAnalysis.h
  include/llvm/MC/MCSchedule.h
  include/llvm/Target/TargetInstrPredicate.td
  include/llvm/Target/TargetSchedule.td
  lib/Target/X86/X86ScheduleBtVer2.td
  test/tools/llvm-mca/X86/BtVer2/reg-move-elimination-1.s
  test/tools/llvm-mca/X86/BtVer2/reg-move-elimination-2.s
  test/tools/llvm-mca/X86/BtVer2/reg-move-elimination-3.s
  tools/llvm-mca/lib/HardwareUnits/RegisterFile.cpp
  tools/llvm-mca/lib/InstrBuilder.cpp
  utils/TableGen/CodeGenSchedule.cpp
  utils/TableGen/CodeGenSchedule.h
  utils/TableGen/SubtargetEmitter.cpp

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D53134.169189.patch
Type: text/x-patch
Size: 35225 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181011/1f2834ff/attachment-0001.bin>


More information about the llvm-commits mailing list