Find a file
Connor Abbott 7ce86e6938 nir/search: Add automaton-based pre-searching
nir_opt_algebraic is currently one of the most expensive NIR passes,
because of the many different patterns we've added over the years. Even
though patterns are already sorted by opcode, there are still way too
many patterns for common opcodes like bcsel and fadd, which means that
many patterns are tried but only a few actually match. One way to fix
this is to add a pre-pass over the code that scans it using an automaton
constructed beforehand, similar to the automatons produced by lex and
yacc for parsing source code. This automaton has to walk the SSA graph
and recognize possible pattern matches.

It turns out that the theory to do this is quite mature already, having
been developed for instruction selection as well as other non-compiler
things. I followed the presentation in the dissertation cited in the
code, "Tree algorithms: Two Taxonomies and a Toolkit," trying to keep
the naming similar. To create the automaton, we have to perform
something like the classical NFA to DFA subset construction used by lex,
but it turns out that actually computing the transition table for all
possible states would be way too expensive, with the dissertation
reporting times of almost half an hour for an example of size similar to
nir_opt_algebraic. Instead, we adopt one of the "filter" approaches
explained in the dissertation, which trade much faster table generation
and table size for a few more table lookups per instruction at runtime.
I chose the filter which resulted the fastest table generation time,
with medium table size. Right now, the table generation takes around .5
seconds, despite being implemented in pure Python, which I think is good
enough. Based on the numbers in the dissertation, the other choice might
make table compilation time 25x slower to get 4x smaller table size, but
I don't think that's worth it. As of now, we get the following binary
size before and after this patch:

    text   data	    bss	     dec	   hex	filename
11979455 464720	 730864	13175039	c908ff	before i965_dri.so
   text	   data	    bss	    dec	           hex	filename
12037835 616244	 791792	13445871	cd2aef	after i965_dri.so

There are a number of places where I've simplified the automaton by
getting rid of details in the LHS patterns rather than complicate things
to deal with them. For example, right now the automaton doesn't
distinguish between constants with different values. This means that it
isn't as precise as it could be, but the decrease in compile time is
still worth it -- these are the compilation time numbers for a shader-db
run with my (admittedly old) database on Intel skylake:

Difference at 95.0% confidence
	-42.3485 +/- 1.375
	-7.20383% +/- 0.229926%
	(Student's t, pooled s = 1.69843)

We can always experiment with making it more precise later.

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
2019-05-02 16:14:06 +02:00
.gitlab-ci gitlab-ci: Use LLVM 3.4 from Debian jessie for scons-llvm job 2019-04-16 10:57:55 +02:00
bin delete autotools .gitignore files 2019-04-29 21:17:19 +00:00
build-support configure: commit test files 2017-10-16 16:32:43 -07:00
docs svga: add SVGA_NO_LOGGING env var (v2) 2019-05-02 06:09:35 -06:00
doxygen doxygen: Plumb through gallium/ to automated documentation 2016-05-30 17:53:45 +01:00
include st/nine: skip position checks in SetCursorPosition() 2019-04-20 13:06:29 +02:00
scons scons: Compatibility with Scons development version string 2019-03-12 14:22:34 +00:00
scripts appveyor: Revert commits adding Cygwin support. 2019-01-25 14:13:26 +00:00
src nir/search: Add automaton-based pre-searching 2019-05-02 16:14:06 +02:00
.dir-locals.el dir-locals.el: Adds White Space support 2016-11-14 19:17:49 +02:00
.editorconfig editorconfig: Add max_line_length property 2019-01-10 15:50:34 +02:00
.gitattributes Disable autocrlf for Visual Studio project files. 2008-02-28 12:34:01 +09:00
.gitignore delete autotools .gitignore files 2019-04-29 21:17:19 +00:00
.gitlab-ci.yml gitlab-ci: build vulkan drivers in clang build 2019-05-01 14:37:31 +00:00
.mailmap .mailmap: Add a few more alises for myself 2019-02-13 12:03:41 -08:00
.travis.yml ci: Delete autotools build jobs 2019-04-15 13:44:41 -07:00
Android.common.mk android: fix missing backspace for line continuation 2019-03-08 21:14:24 +00:00
Android.mk lima: add Android build 2019-04-21 01:05:19 +00:00
appveyor.yml appveyor: Revert commits adding Cygwin support. 2019-01-25 14:13:26 +00:00
CleanSpec.mk CleanSpec.mk: Remove HOST_OUT_release 2018-08-02 15:42:40 -06:00
common.py scons/svga: remove opt from the list of valid build types 2018-10-26 12:09:00 -06:00
meson.build kmsro: Add support for V3D. 2019-04-26 14:59:32 -07:00
meson_options.txt intel/common: Add unit tests for gen_mi_builder 2019-04-11 18:04:09 +00:00
README.rst README: Drop the badges from the readme 2019-02-07 12:46:17 -06:00
REVIEWERS docs: drop most autoconf references 2019-04-15 13:44:34 -07:00
SConstruct scons: Require python 2.7 2018-08-16 13:52:56 -07:00
VERSION bump version for 19.0 branch 2019-01-29 15:30:25 -08:00

`Mesa <https://mesa3d.org>`_ - The 3D Graphics Library
======================================================


Source
------

This repository lives at https://gitlab.freedesktop.org/mesa/mesa.
Other repositories are likely forks, and code found there is not supported.


Build & install
---------------

You can find more information in our documentation (`docs/install.html
<https://mesa3d.org/install.html>`_), but the recommended way is to use
Meson (`docs/meson.html <https://mesa3d.org/meson.html>`_):

.. code-block:: sh

  $ mkdir build
  $ cd build
  $ meson ..
  $ sudo ninja install


Support
-------

Many Mesa devs hang on IRC; if you're not sure which channel is
appropriate, you should ask your question on `Freenode's #dri-devel
<irc://chat.freenode.net#dri-devel>`_, someone will redirect you if
necessary.
Remember that not everyone is in the same timezone as you, so it might
take a while before someone qualified sees your question.
To figure out who you're talking to, or which nick to ping for your
question, check out `Who's Who on IRC
<https://dri.freedesktop.org/wiki/WhosWho/>`_.

The next best option is to ask your question in an email to the
mailing lists: `mesa-dev\@lists.freedesktop.org
<https://lists.freedesktop.org/mailman/listinfo/mesa-dev>`_


Bug reports
-----------

If you think something isn't working properly, please file a bug report
(`docs/bugs.html <https://mesa3d.org/bugs.html>`_).


Contributing
------------

Contributions are welcome, and step-by-step instructions can be found in our
documentation (`docs/submittingpatches.html
<https://mesa3d.org/submittingpatches.html>`_).

Note that Mesa uses email mailing-lists for patches submission, review and
discussions.