Bug 79462 - [NVC0/Codegen] Shader compilation falis in spill logic
Summary: [NVC0/Codegen] Shader compilation falis in spill logic
Status: RESOLVED FIXED
Alias: None
Product: Mesa
Classification: Unclassified
Component: Drivers/DRI/nouveau (show other bugs)
Version: unspecified
Hardware: Other All
: medium normal
Assignee: Nouveau Project
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2014-05-30 18:44 UTC by Ilia Mirkin
Modified: 2014-09-26 06:04 UTC (History)
1 user (show)

See Also:
i915 platform:
i915 features:


Attachments
failing tgsi shader (9.33 KB, text/plain)
2014-05-30 18:44 UTC, Ilia Mirkin
Details

Description Ilia Mirkin 2014-05-30 18:44:00 UTC
Created attachment 100179 [details]
failing tgsi shader

The attached shader fails in the RA step, when inserting spill code:

nv50_ir::SpillCodeInserter::run (this=0x7ffffffec0c0, lst=std::list)
    at codegen/nv50_ir_ra.cpp:1561
1561             while (!dval->uses.empty()) {

Easily reproduced with nouveau_compiler -a c0. Apparently this shader is generated as part of the d3d9 st, with skyrimlauncher, when it's trying to detect the graphics card.

dval is null, which means that something out there isn't an lvalue. Or, in this case, apparently a null value??

(gdb) p *defi
$4 = {_vptr.Instruction = 0x86e570, next = 0x0, prev = 0x0, id = -1, serial = 27, op = nv50_ir::OP_SPLIT, 
  dType = nv50_ir::TYPE_B128, sType = nv50_ir::TYPE_B128, cc = nv50_ir::CC_TR, rnd = nv50_ir::ROUND_N, 
  cache = nv50_ir::CACHE_CA, subOp = 0, encSize = 0, saturate = 0, join = 0, fixed = 0, terminator = 0, 
  ftz = 0, dnz = 0, ipa = 0, lanes = 15, perPatch = 0, exit = 0, mask = 0, postFactor = 0 '\000', 
  predSrc = -1 '\377', flagsDef = -1 '\377', flagsSrc = -1 '\377', sched = 0, bb = 0x0, 
  defs = std::deque with 4 elements = {{value = 0x0, origin = 0x0, insn = 0x200}, {value = 0x85ce30, 
      origin = 0x7ffff71a0698 <main_arena+88>, insn = 0x9e5e40}, {value = 0x0, origin = 0x0, 
      insn = 0x9e5e40}, {value = 0x0, origin = 0x0, insn = 0x9e5e40}}, 
  srcs = std::deque with 1 elements = {{mod = {bits = 0 '\000'}, indirect = "\377\377", 
      swizzle = 0 '\000', usedAsPtr = false, value = 0x0, insn = 0x200}}}

Note that the second def isn't null but the others are? Perhaps this happens as part of dead code elimination? Need to investigate more.
Comment 1 Ilia Mirkin 2014-07-31 18:35:19 UTC
The below patch helps avoid the crash, but it still still generate incorrect code. I think there are a few issues here, and I'll have to think a little harder about how to properly resolve them.


diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp
index 5ab6570..89c83cb 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp
@@ -1576,7 +1576,8 @@ SpillCodeInserter::run(const std::list<ValuePair>& lst)
 
          assert(defi);
          if (defi->isPseudo()) {
-            d = lval->defs.erase(d);
+            while (d != lval->defs.end() && (*d)->getInsn() == defi)
+               d = lval->defs.erase(d);
             --d;
             if (slot->reg.file == FILE_MEMORY_LOCAL)
                delete_Instruction(func->getProgram(), defi);
Comment 2 Ilia Mirkin 2014-09-15 16:10:49 UTC
I've spent a bunch of time looking at this issue.

So *one* of the problems is that we delete the instruction too early. But I think there's more going on. Still debugging. The issue happens if we want to spill a value that is split.
Comment 3 Ilia Mirkin 2014-09-25 01:48:41 UTC
http://patchwork.freedesktop.org/patch/34098/

Please see if this helps.
Comment 4 Ilia Mirkin 2014-09-26 06:04:56 UTC
I've pushed out the fix, makes at least the attached shader compile. It also fixed UE4 demos which appear to render fine. Should get backported to 10.3 and probably 10.2 as well.

commit 0147c10c5f00b43696ba660aab604d674a75e83c
Author: Ilia Mirkin <imirkin@alum.mit.edu>
Date:   Wed Sep 24 21:45:07 2014 -0400

    nv50/ir: avoid deleting pseudo instructions too early


Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.