Find a file
Kenneth Graunke a8fafc0f32 intel/elk: Re-run register allocation once after recreating the graph
Our backend does a somewhat unusual sequence:

1. Set up the interference graph
2. Try to register allocate
3. Fail and realize we have to spill
4. Recreate(!) the interference graph with different node counts,
   because unfortunately spills and fills may need temporary registers
   set aside for that purpose, which can no longer be used generally.
5. Ask for the best spill node because we know we must spill

On step 4, ra_realloc_interference_graph() reallocs the in_stack
bitset for the new nodes.  However, it leaves the new bitset words
uninitialized, because it's supposed to be set up by ra_select().
On step 5, however, the Intel backend calls ra_get_best_spill_node()
_without_ first calling ra_select() (or ra_allocate()).  So at that
point, the in_stack bitset is not properly initialized, and we'll
end up reading uninitialized garbage in ra_get_best_spill_node(),
and non-deterministically end up skipping candidates for spilling.

While debugging this, I observed ra_get_best_spill_node() seeing
non-zero in_stack bits set while g->tmp.stack_count was 0.  So no
nodes could possibly be in the stack.

We could simply initialize the memory, but there's a deeper problem:
in Chaitin-Briggs allocators, the list of spill candidates is built in
the "Select" step.  In our implementation, we technically don't make a
list of candidates, but rather flag registers that *aren't* candidates.
By never running ra_allocate() on our new graph, we never produce that
info.  So when we ask for a spill node, we consider *all* registers as
spill candidates, which is far from ideal.

To fix this, we simply call ra_allocate() to rebuild that information
on the new graph.  It's worth noting that it may not be quite the same
as the information we had for our old graph, too, as we reserved some
registers, increasing interference.

This escaped our notice for a long time because our allocation loop
tries to spill a single register, tries to allocate, and repeats if
it fails.  Because retrying calls ra_select(), which initializes the
spill candidate info, this non-determinism only happened for the first
register selected.  However, recently the backend gained support for
spilling multiple registers in each loop step, which highlighted this
problem, as different per-step-spill-sizes produced different results
due to this non-determinism.

Cc: mesa-stable
Fixes: e99081e76d ("intel/fs/ra: Spill without destroying the interference graph")
2024-06-20 01:31:19 -07:00
.ci-farms Revert "ci: lima farm maintenance" 2024-06-18 19:13:27 +00:00
.ci-farms-disabled Revert "ci: lima farm maintenance" 2024-06-18 19:13:27 +00:00
.github/workflows
.gitlab gitlab: Reference hang debugging documenttion 2024-05-16 09:47:53 +00:00
.gitlab-ci ci/vkd3d: drop redundant "vkd3d-proton execution: SUCCESS" 2024-06-18 09:58:55 +00:00
android nouveau: import libdrm_nouveau 2024-03-13 15:21:07 +00:00
bin zink: Always include renderdoc_app.h 2024-06-20 07:02:15 +00:00
build-support meson: move tsan-blacklist.txt to build-support with the other build support files 2024-05-01 07:05:12 +00:00
docs docs: update calendar for 24.1.2 2024-06-19 17:11:30 +00:00
include zink: Always include renderdoc_app.h 2024-06-20 07:02:15 +00:00
src intel/elk: Re-run register allocation once after recreating the graph 2024-06-20 01:31:19 -07:00
subprojects subprojects: uprev perfetto to v45.0 2024-05-21 20:02:00 +00:00
.clang-format meson: enable the clang-format target 2023-05-29 11:57:08 +00:00
.clang-format-ignore ci: enforce formatting for RADV & ACO 2023-06-16 19:59:52 +00:00
.clang-format-include teflon: Initial commit 2024-01-24 10:02:10 +00:00
.dir-locals.el
.editorconfig
.git-blame-ignore-revs freedreno: Add reformatting commits to .git-blame-ignore-revs 2023-09-22 02:07:36 +00:00
.gitattributes gitlab: Highlight .cl as C 2023-11-02 11:37:46 +00:00
.gitignore .gitignore: add .cache folder 2024-05-13 14:32:12 +00:00
.gitlab-ci.yml ci/image-tags: rename DEBIAN_X86_64_TEST_*_TAG to drop the x86 mention 2024-05-23 06:00:50 +02:00
.graphqlrc.yml
.mailmap mailmap: update rohan's primary email address 2024-06-19 09:06:15 +00:00
.mr-label-maker.yml mr-label-maker: Separate freedreno and turnip labels 2024-06-14 18:47:15 +00:00
CODEOWNERS CODEOWNERS: update Imagination maintainers 2024-01-19 10:26:15 +00:00
meson.build zink: Always include renderdoc_app.h 2024-06-20 07:02:15 +00:00
meson_options.txt build/amd: add amd-use-llvm build option 2024-05-30 19:05:00 +00:00
README.rst README: update links to our own docs 2024-05-15 17:13:10 +00:00
VERSION VERSION: bump to 20.2 2024-04-24 19:51:59 +00: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.rst
<https://docs.mesa3d.org/install.html>`_), but the recommended way is to use
Meson (`docs/meson.rst <https://docs.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 `OFTC's #dri-devel
<irc://irc.oftc.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.rst <https://docs.mesa3d.org/bugs.html>`_).


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

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

Note that Mesa uses gitlab for patches submission, review and discussions.