Commit Graph

4523 Commits

Author SHA1 Message Date
Craig Topper
e5b799ba09 [X86] Add the ability to force an EVEX2VEX mapping table entry from the .td files. Remove remaining manual table entries from the tablegen emitter.
This adds an EVEX2VEXOverride string to the X86 instruction class in X86InstrFormats.td. If this field is set it will add manual entry in the EVEX->VEX tables that doesn't check the encoding information.

Then use this mechanism to map VMOVDU/A8/16, 128-bit VALIGN, and VPSHUFF/I instructions to VEX instructions.

Finally, remove the manual table from the emitter.

This has the bonus of fully sorting the autogenerated EVEX->VEX tables by their EVEX instruction enum value. We may be able to use this to do a binary search for the conversion and get rid of the need to create a DenseMap.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@335018 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-19 04:24:44 +00:00
Craig Topper
023b407c11 [X86] Add a new VEX_WPrefix encoding to tag EVEX instruction that have VEX.W==1, but can be converted to their VEX equivalent that uses VEX.W==0.
EVEX makes heavy use of the VEX.W bit to indicate 64-bit element vs 32-bit elements. Many of the VEX instructions were split into 2 versions with different masking granularity.

The EVEX->VEX table generate can collapse the two versions if the VEX version uses is tagged as VEX_WIG. But if the VEX version is instead marked VEX.W==0 we can't combine them because we don't know if there is also a VEX version with VEX.W==1.

This patch adds a new VEX_W1X tag that indicates the EVEX instruction encodes with VEX.W==1, but is safe to convert to a VEX instruction with VEX.W==0.

This allows us to remove a bunch of manual EVEX->VEX table entries. We may want to look into splitting up the VEX_WPrefix field which would simplify the disassembler.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@335017 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-19 04:24:42 +00:00
Craig Topper
2bcbecf852 [X86] Encode the EVEX2VEX exception list information in .td files instead of the emitter source.
Rather than having an exclusion list in tablegen sources, add a flag to the X86 instruction records that can be used to suppress checking for convertibility.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334971 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-18 18:47:07 +00:00
Craig Topper
46cd4ae585 [TableGen] Make TiedAsmOperandTable in the AsmMatcher 'static' since its at file scope.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334957 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-18 16:17:46 +00:00
Craig Topper
61d5cb52aa [TableGen] Remove unused member variable.
I think this became unused after r324196.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334956 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-18 16:17:45 +00:00
Sander de Smalen
b0c8738429 [TableGen][AsmMatcherEmitter] Allow tied operands of different classes in aliases.
Allow a tied operand of a different operand class in InstAliases,
so that the operand can be printed (and added to the MC instruction)
as the appropriate register. For example, 'GPR64as32', which would
be printed/parsed as a 32bit register and should match a tied 64bit
register operand, where the former is a sub-register of the latter.

This patch also generalizes the constraint checking to an overrideable
method in MCTargetAsmParser, so that target asmparsers can specify
whether a given operand satisfies the tied register constraint.

Reviewers: olista01, rengolin, fhahn, SjoerdMeijer, samparker, dsanders, craig.topper

Reviewed By: fhahn

Differential Revision: https://reviews.llvm.org/D47714



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334942 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-18 13:39:29 +00:00
Craig Topper
50ea5bbb2d [TableGen] Prevent double flattening of InstAlias asm strings in the asm matcher emitter.
Unlike CodeGenInstruction, CodeGenInstAlias was flatting asm strings in its constructor. For instructions it was the users responsibility to flatten the string.

AsmMatcherEmitter didn't know this and treated them the same. This caused double flattening of InstAliases. This is mostly harmless unless the desired assembly string contains curly braces. The second flattening wouldn't know to ignore these and would remove the curly braces. And for variant 1 it would remove the contents of them as well.

To mitigate this, this patch makes removes the flattening from the CodeGenIntAlias constructor and modifies AsmWriterEmitter to account for the flattening not having been done.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334919 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-18 01:28:01 +00:00
Craig Topper
73b1acb59c [X86] More additions to the load folding tables based on the autogenerated tables.
Including more additions for NotMemoryFoldable to remove some entries from the autogenerated table.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334898 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-16 23:25:50 +00:00
Daniel Sanders
a2824b68e6 [globalisel][tablegen] Add support for C++ predicates on PatFrags and use it to support BFC on ARM.
So far, we've only handled special cases of PatFrag like ImmLeaf. This patch
adds support for the remaining cases using similar mechanisms.

Like most C++ code from SelectionDAG, GISel and DAGISel expect to operate on
different types and representations and as such the code is not compatible
between the two. It's therefore necessary to add an alternative implementation
in the GISelPredicateCode field.

The target test for this feature could easily be done with IntImmLeaf and this
would save on a little boilerplate. The reason I've chosen to implement this
using PatFrag.GISelPredicateCode and not IntImmLeaf is because I was unable to
find a rule that was blocked solely by lack of support for PatFrag predicates. I
found that the ones I investigated as being likely candidates for the test
were further blocked by other things.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334871 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-15 23:13:43 +00:00
Craig Topper
61c89e393d [X86] Add 'Z' to the internal names of various EVEX instructions for overall consistency.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334785 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-15 04:42:54 +00:00
Florian Hahn
74dff3bf01 Revert r334764, as it breaks some bots
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334767 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-14 20:32:58 +00:00
Florian Hahn
cf7e990880 [TableGen] Make TreePatternNode::getChild return a reference (NFC)
The return value of TreePatternNode::getChild is never null. This patch also
updates various places that use return values of getChild to also use
references. Those changes were suggested post-commit for D47463.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334764 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-14 20:23:48 +00:00
Florian Hahn
5cd96b7a00 [TableGen] Move some shared_ptrs to avoid unnecessary copies (NFC).
Those changes were suggested post-commit for D47463.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334706 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-14 11:56:19 +00:00
Florian Hahn
77fc0e9119 [TableGen] Make getOnlyTree return a const ref (NFC)
This avoids some unnecessary copies of shared_ptrs.
Those changes were suggested post-commit for D47463.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334656 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-13 20:59:53 +00:00
Clement Courbet
fa81124fba [TableGen] Emit a fatal error on inconsistencies in resource units vs cycles.
Summary:
For targets I'm not familiar with, I've automatically made the "default to 1 for each resource" behaviour explicit in the td files.
For more obvious cases, I've ventured a fix.

Some notes:
 - Exynos is especially fishy.
 - AArch64SchedThunderX2T99.td had some truncated entries. If I understand correctly, the person who wrote that interpreted the ResourceCycle as a range. I made the decision to use the upper/lower bound for consistency with the 'Latency' value. I'm sure there is a better choice.
 - The change to X86ScheduleBtVer2.td is an NFC, it just makes values more explicit.

Also see PR37310.

Reviewers: RKSimon, craig.topper, javed.absar

Subscribers: kristof.beyls, llvm-commits

Differential Revision: https://reviews.llvm.org/D46356

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334586 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-13 09:41:49 +00:00
Craig Topper
dae4c99b4e [X86] Mark all instructions that have masked store semantics with NotMemoryFoldable. Remove dependency on SchedRW from memory table autogenerator.
Previously we were whitelisting in instructions based on their SchedRW value. With the masked store instructions explicitly removed via NotMemoryFoldable, we don't seem to need this check anymore.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334563 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-13 00:04:08 +00:00
Craig Topper
0932f64556 [X86] Remove unnecessary include from one of the tblgen emitters.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334530 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-12 19:59:10 +00:00
Craig Topper
36aef6e2ca [X86] Don't add stores to the autogenerated load folding tables if the register and memory operands have different widths.
This can cause the amount of the memory written to be changed which would be bad.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334480 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-12 07:32:18 +00:00
Craig Topper
a742c52562 [X86] Update folding table generator to properly detect RMW arithmetic instructions.
The RMW instructions are detected by reading the SchedRW data, but the RMW instructions have had their SchedRW changed in recent months. This broke the expectation.

We probably should fix this to use the mayLoad/mayStore flags if possible.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334478 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-12 07:32:15 +00:00
Craig Topper
f7bc6cbf14 [X86] Enforce agreement of AdSize field when autogenerating load folding table entries.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334473 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-12 04:34:58 +00:00
David Blaikie
7f3c26cfc1 TableGen: Change some pointer parameters to references since they're never null anyway
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334446 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-11 22:14:43 +00:00
Craig Topper
7b57400c9d [TableGen] Make better use of std::map::emplace and emplace construct the object in the map rather than moving it into it. Remove a use std::map::find by remembering the return from emplace.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334380 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-10 23:15:49 +00:00
Craig Topper
84fc2f53bf [TableGen] Combine two constructors by taking vectors by value instead of trying to support combininations for rvalue and lvalue references.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334379 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-10 23:15:48 +00:00
Florian Hahn
db3fe986cb Revert r334374 [TableGen] Move some shared_ptrs to avoid unnecessary copies (NFC).
This breaks some builders.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334376 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-10 21:06:24 +00:00
Florian Hahn
e956ae9dc3 [TableGen] Move some shared_ptrs to avoid unnecessary copies (NFC).
Those changes were suggested post-commit for D47463.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334374 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-10 20:38:52 +00:00
Daniel Sanders
f5137255b6 [tablegen] Improve performance on *GenRegisterInfo.inc by replacing SparseVector with BitVector. NFC
Summary: Generating X86GenRegisterInfo.inc and AArch64GenRegisterInfo.inc is 8-9% faster on my build.

Reviewers: bogner, javed.absar

Reviewed By: bogner

Subscribers: llvm-commits, kristof.beyls

Differential Revision: https://reviews.llvm.org/D47907

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334337 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-08 23:12:29 +00:00
Florian Hahn
3a14e8ce77 [TableGen] Make DAGInstruction own Pattern to avoid leaking it.
Reviewers: dsanders, craig.topper, stoklund, nhaehnle

Reviewed By: craig.topper

Differential Revision: https://reviews.llvm.org/D47525


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334275 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-08 09:54:04 +00:00
Craig Topper
1e296472a5 [X86] Rename vy512mem->vy512xmem and vz256xmem->vz256mem.
The index size is represented by the letter after the 'v'. The number represents the memory size. If an 'x' appears after the number its means the index register can be from VR128X/VR256X instead of VR128/VR256.

As vy512mem uses a VR256X index it should have an x.
And vz256mem uses a VR512 index so it shouldn't have an x.

I admit these names kind of suck and are confusing.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334120 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-06 19:15:12 +00:00
Nicolai Haehnle
6f256bce8f TableGen/DAGPatterns: Allow bit constants in addition to int constants
Summary:
Implicit casting is a simple quality of life improvement.

Change-Id: I3d2b31b8b8f12cbb1e84f691e359fa713a9c4b42

Reviewers: tra, simon_tatham, craig.topper, MartinO, arsenm

Subscribers: wdng, llvm-commits

Differential Revision: https://reviews.llvm.org/D47432

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333904 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-04 14:45:12 +00:00
Andrea Di Biagio
ae5fb65ace [MCSchedule] Add the ability to compute the latency and throughput information for MCInst.
This patch extends the MCSchedModel API with new methods that can be used to
obtain the latency and reciprocal througput information for an MCInst.

Scheduling models have recently gained the ability to resolve variant scheduling
classes associated with MCInst objects. Before, models were only able to resolve
a variant scheduling class from a MachineInstr object.

This patch is mainly required by D47374 to avoid regressing a pair of x86
specific -print-schedule tests for btver2. Patch D47374 introduces a new variant
class to teach the btver scheduling model (x86 target) how to correctly compute
the latency profile for some zero-idioms using the new scheduling predicates.

The new methods added by this patch would be mainly used by llc when flag
-print-schedule is specified. In particular, tests that contain inline assembly
require that code is parsed at code emission stage into a sequence of MCInst.
That forces the print-schedule functionality to query the latency/rthroughput
information for MCInst instructions too. If we don't expose this new API, then
we lose "-print-schedule" test coverage as soon as variant scheduling classes
are added to the x86 models.

The tablegen SubtargetEmitter changes teaches how to query latency profile
information using a object that derives from TargetSubtargetInfo. Note that this
should really have been part of r333286. To avoid code duplication, the logic
that "resolves" variant scheduling classes for MCInst, has been moved to a
common place in MC. That logic is used by the "resolveVariantSchedClass" methods
redefined in override by the tablegen'd GenSubtargetInfo classes.

Differential Revision: https://reviews.llvm.org/D47536


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333650 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-31 13:30:42 +00:00
Florian Hahn
0b596f0cd2 [TableGen] Avoid leaking TreePatternNodes by using shared_ptr.
By using std::shared_ptr for TreePatternNode, we can avoid leaking them.

Reviewers: craig.topper, dsanders, stoklund, tstellar, zturner

Reviewed By: dsanders

Differential Revision: https://reviews.llvm.org/D47463


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333591 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-30 21:00:18 +00:00
Florian Hahn
98de50d1f8 [TableGen] Use explicit constructor for InstMemo
This should fix a few buildbot failures with old
GCC versions.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333448 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-29 18:34:42 +00:00
Florian Hahn
e4c36d2f8b [TableGen] Fix leaking of PhysRegInputs.
Instead of dynamically allocating the vector for PhysRegs, we can
allocate it on the stack and move it into InstructionMemo.

Reviewers: mcrosier, craig.topper, RKSimon, dsanders

Reviewed By: dsanders

Differential Revision: https://reviews.llvm.org/D47461


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333438 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-29 17:40:03 +00:00
Florian Hahn
300f478365 [TableGen] Fix leaking synthesized registers.
By keeping track of unique_ptrs to the synthesized definitions in
CodeGenRegBank we avoid leaking them.

Reviewers: dsanders, kparzysz, stoklund

Reviewed By: dsanders

Differential Revision: https://reviews.llvm.org/D47462


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333434 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-29 16:55:06 +00:00
Andrea Di Biagio
5bedd79076 [Tablegen] Avoid generating empty switch statements. NFC
This fixes an MSVC warning (warning C4065: switch statement contains 'default'
but no 'case' labels) introduced with revision 333293.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333363 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-27 19:08:12 +00:00
Andrea Di Biagio
66f9771e76 [Tablegen][SubtargetEmitter] Add a default case to the auto-generated switch in MCSubtargetInfo::resolveVariantSchedClass(). NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333293 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-25 18:25:54 +00:00
Andrea Di Biagio
0d3a4af35c [RFC][Patch 2/3] Add a MCSubtargetInfo hook to resolve variant scheduling classes.
This patch is the second of a sequence of three patches related to LLVM-dev RFC
"MC support for varinat scheduling classes".
https://lists.llvm.org/pipermail/llvm-dev/2018-May/123181.html

The goal of this patch is to enable the resolution of variant classes in MC with
the help of a new method named `MCSubtargetInfo::resolveVariantSchedClass()`.

This patch also teaches the SubtargetEmitter how to automatically generate the
definition of method resolveVariantSchedClass().  That definition is emitted
within a sub-class of MCSubtargetInfo named XXXGenMCSubtargetInfo (where XXX is
the name of the Target).

Differential Revision: https://reviews.llvm.org/D47077


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333286 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-25 16:02:43 +00:00
Andrea Di Biagio
e68d92b387 [RFC][Patch 1/3] Add a new class of predicates for variant scheduling classes.
This patch is the first of a sequence of three patches described by the LLVM-dev
RFC "MC support for variant scheduling classes".
http://lists.llvm.org/pipermail/llvm-dev/2018-May/123181.html

The goal of this patch is to introduce a new class of scheduling predicates for
SchedReadVariant and SchedWriteVariant.

An MCSchedPredicate can be used instead of a normal SchedPredicate to model
checks on the instruction (either a MachineInstr or a MCInst).
Internally, an MCSchedPredicate encapsulates an MCInstPredicate definition.
MCInstPredicate allows the definition of expressions with a well-known semantic,
that can be used to generate code for both MachineInstr and MCInst.

This is the first step toward teaching to tools like lllvm-mca how to resolve
variant scheduling classes.

Differential Revision: https://reviews.llvm.org/D46695


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333282 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-25 15:55:37 +00:00
Roman Tereshin
f932fced7c [GlobalISel][InstructionSelect] Switching over root LLTs, perf patch 10
This patch continues a series of patches started by r332907 (reapplied
as r332917).

In this commit we introduce new matching opcode for the MatchTable:
GIM_SwitchType, similar to GIM_SwitchOpcode, and use it to switch over
LLTs of def operands of root instructions on the 2nd level of the
MatchTable within GIM_SwitchOpcode's cases.

This is expected to decrease time GlobalISel spends in its
InstructionSelect pass by about 6.5% for an -O0 build as measured on
sqlite3-amalgamation (http://sqlite.org/download.html) targeting
AArch64 (cross-compile on x86).

Reviewers: qcolombet, dsanders, bogner, aemerson, javed.absar

Reviewed By: qcolombet

Subscribers: rovka, llvm-commits, kristof.beyls

Differential Revision: https://reviews.llvm.org/D44700

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333146 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-24 00:24:15 +00:00
Roman Tereshin
57baf695d8 [GlobalISel][InstructionSelect] Moving Reg Bank Checks forward, perf patch 9
This patch continues a series of patches started by r332907 (reapplied
as r332917).

In this commit we move register bank checks back from epilogue of
every rule matcher to a position locally close to the rest of the
checks for a particular (nested) instruction.

This increases the number of common conditions within 2nd level
groups.

This is expected to decrease time GlobalISel spends in its
InstructionSelect pass by about 2% for an -O0 build as measured on
sqlite3-amalgamation (http://sqlite.org/download.html) targeting
AArch64 (cross-compile on x86).

Reviewers: qcolombet, dsanders, bogner, aemerson, javed.absar

Reviewed By: qcolombet

Subscribers: rovka, llvm-commits, kristof.beyls

Differential Revision: https://reviews.llvm.org/D44700

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333144 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-23 23:58:10 +00:00
Roman Tereshin
c1e740501d [GlobalISel][InstructionSelect] Maximizing # of Group's common conditions, perf patch 8
This patch continues a series of patches started by r332907 (reapplied
as r332917).

In this commit we greedily stuff 2nd level GroupMatcher's common
conditions with as many predicates as possible. This is purely
post-processing and it doesn't change which rules are put into the
groups in the first place: that decision is made by looking at the
first common predicate only.

The compile time improvements are minor and well within error margin,
however, it's highly improbable that this transformation could
pessimize performance, thus I'm still committing it for potential
gains for targets not implementing GlobalISel yet and out of tree
targets.

Reviewers: qcolombet, dsanders, bogner, aemerson, javed.absar

Reviewed By: qcolombet

Subscribers: rovka, llvm-commits, kristof.beyls

Differential Revision: https://reviews.llvm.org/D44700

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333139 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-23 22:50:53 +00:00
Roman Tereshin
673840e684 [GlobalISel][Tablegen] Assign small opcodes to pseudos
Sort pseudo instructions first while emitting enum's for target
instructions info. That puts them close to each other and to generic
G_* opcodes for GlobalISel. This makes it easier to build small jump
tables over opcodes that could be directly embedded into MatchTable's
Tablegen'erated for GlobalISel's InstructionSelect.

Reviewed By: bogner

Differential Revision: https://reviews.llvm.org/D47240

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333135 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-23 22:10:21 +00:00
Roman Tereshin
5f477b2b13 [GlobalISel][InstructionSelect] Sorting MatchTable's 2nd level by root LLT, perf patch 7
This patch continues a series of patches started by r332907 (reapplied
as r332917).

In this commit we sort rules within their 2nd level by the type check
on def operand of the root instruction, which allows for better
nesting grouping on the level.

This is expected to decrease time GlobalISel spends in its
InstructionSelect pass by roughly 22% for an -O0 build as measured on
sqlite3-amalgamation (http://sqlite.org/download.html) targeting
AArch64 (cross-compile on x86).

Reviewers: qcolombet, dsanders, bogner, aemerson, javed.absar

Reviewed By: qcolombet

Subscribers: rovka, llvm-commits, kristof.beyls

Differential Revision: https://reviews.llvm.org/D44700

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333131 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-23 21:30:16 +00:00
Roman Tereshin
c349f81487 [Tablegen] Tidying up InstRegexOp a little, NFC
Differential Review: https://reviews.llvm.org/D47240

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333121 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-23 20:45:43 +00:00
Roman Tereshin
4cb7c3ee0c [GlobalISel][InstructionSelect] Moving type checks forward, perf patch 6
This patch continues a series of patches started by r332907 (reapplied
as r332917)

In this commit we sort type checks towards the beginning of every rule
within the MatchTable as they fail often and it's best to fail early.

This is expected to decrease time GlobalISel spends in its
InstructionSelect pass by roughly 7% for an -O0 build as measured on
sqlite3-amalgamation (http://sqlite.org/download.html) targeting
AArch64. The amalgamation is a large single-file C-source that makes
compiler backend performance improvements to stand out from frontend.
It's also a part of CTMark.

Reviewers: qcolombet, dsanders, bogner, aemerson, javed.absar

Reviewed By: qcolombet

Subscribers: rovka, llvm-commits, kristof.beyls

Differential Revision: https://reviews.llvm.org/D44700

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333114 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-23 19:16:59 +00:00
Petar Jovanovic
4d9795156d [X86][MIPS][ARM] New machine instruction property 'isMoveReg'
This property is needed in order to follow values movement between
registers. This property is used in TII to implement method that
returns true if simple copy like instruction is recognized, along
with source and destination machine operands.

Patch by Nikola Prica.

Differential Revision: https://reviews.llvm.org/D45204


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333093 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-23 15:28:28 +00:00
Nicola Zaghen
c671da0827 Remove DEBUG macro.
Now that the LLVM_DEBUG() macro landed on the various sub-projects
the DEBUG macro can be removed.
Also change the new uses of DEBUG to LLVM_DEBUG.

Differential Revision: https://reviews.llvm.org/D46952



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333091 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-23 15:09:29 +00:00
Roman Tereshin
38031eccca [GlobalISel][InstructionSelect] MatchTable second level grouping, perf patch 5
This patch continues a series of patches started by r332907 (reapplied
as r332917)

In this commit we start grouping rules with common first condition on
the second level of the table.

This is expected to decrease time GlobalISel spends in its
InstructionSelect pass by roughly 13% for an -O0 build as measured on
sqlite3-amalgamation (http://sqlite.org/download.html) targeting
AArch64.

Reviewers: qcolombet, dsanders, bogner, aemerson, javed.absar

Reviewed By: qcolombet

Subscribers: rovka, llvm-commits, kristof.beyls

Differential Revision: https://reviews.llvm.org/D44700

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333053 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-23 02:04:19 +00:00
Roman Tereshin
792c45b7cd [GlobalISel][InstructionSelect] Switching MatchTable over opcodes, perf patch 4
This patch continues a series of patches started by r332907 (reapplied
as r332917)

In this commit we introduce a new matching opcode GIM_SwitchOpcode
that implements a jump table over opcodes and start emitting them for
root instructions.

This is expected to decrease time GlobalISel spends in its
InstructionSelect pass by roughly 20% for an -O0 build as measured on
sqlite3-amalgamation (http://sqlite.org/download.html) targeting
AArch64.

To some degree, we assume here that the opcodes form a dense set,
which is true at the moment for all upstream targets given the
limitations of our rule importing mechanism.

It might not be true for out of tree targets, specifically due to
pseudo's. If so, we might noticeably increase the size of the
MatchTable with this patch due to padding zeros. This will be
addressed later.

Reviewers: qcolombet, dsanders, bogner, aemerson, javed.absar

Reviewed By: qcolombet

Subscribers: rovka, llvm-commits, kristof.beyls

Differential Revision: https://reviews.llvm.org/D44700

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333017 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-22 19:37:59 +00:00
Roman Tereshin
638915a37f [GlobalISel][InstructionSelect] Sorting MatchTable's first level by opcodes and num operands, perf patch 3
This patch continues a series of patches started by r332907 (reapplied as r332917)

In this commit we start sorting the rules by the opcode first, and if
the same, by the number of operands of the root instructions. This
allows better grouping and safe as patterns with different opcodes are
mutually exclusive.

This is expected to decrease time GlobalISel spends in its
InstructionSelect pass by roughly 18% for an -O0 build as measured on
sqlite3-amalgamation (http://sqlite.org/download.html) targeting
AArch64.

I'm also removing RuleMatcher::getFirstConditionAsRootType() function
here and moving it to a later patch within the series as it's not used
yet and was causing a warning on sanitizer-ppc64le-linux bot.

Reviewers: qcolombet, dsanders, bogner, aemerson, javed.absar

Reviewed By: qcolombet

Subscribers: rovka, llvm-commits, kristof.beyls

Differential Revision: https://reviews.llvm.org/D44700


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333001 91177308-0d34-0410-b5e6-96231b3b80d8
2018-05-22 16:54:27 +00:00