<html>
<head>
<base href="https://bugs.freedesktop.org/">
</head>
<body><span class="vcard"><a class="email" href="mailto:lil_tux@web.de" title="Heiko <lil_tux@web.de>"> <span class="fn">Heiko</span></a>
</span> changed
<a class="bz_bug_link
bz_status_NEW "
title="NEW - HD6950 GPU lockup loop with various steam games (octodad[always], saints row 4[always], dead island[always], grid autosport[sometimes])"
href="https://bugs.freedesktop.org/show_bug.cgi?id=94900">bug 94900</a>
<br>
<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>What</th>
<th>Removed</th>
<th>Added</th>
</tr>
<tr>
<td style="text-align:right;">Attachment #125271 is obsolete</td>
<td>
</td>
<td>1
</td>
</tr></table>
<p>
<div>
<b><a class="bz_bug_link
bz_status_NEW "
title="NEW - HD6950 GPU lockup loop with various steam games (octodad[always], saints row 4[always], dead island[always], grid autosport[sometimes])"
href="https://bugs.freedesktop.org/show_bug.cgi?id=94900#c28">Comment # 28</a>
on <a class="bz_bug_link
bz_status_NEW "
title="NEW - HD6950 GPU lockup loop with various steam games (octodad[always], saints row 4[always], dead island[always], grid autosport[sometimes])"
href="https://bugs.freedesktop.org/show_bug.cgi?id=94900">bug 94900</a>
from <span class="vcard"><a class="email" href="mailto:lil_tux@web.de" title="Heiko <lil_tux@web.de>"> <span class="fn">Heiko</span></a>
</span></b>
<pre>Created <span class=""><a href="attachment.cgi?id=126832" name="attach_126832" title="Possible fix for the lockups">attachment 126832</a> <a href="attachment.cgi?id=126832&action=edit" title="Possible fix for the lockups">[details]</a></span> <a href='page.cgi?id=splinter.html&bug=94900&attachment=126832'>[review]</a>
Possible fix for the lockups
The more I look at the sb code the more I dislike it :/ Anyhow, looks like the
GCM pass is b0rked and doesn't like unused ops at all.
The problem with that octodad trace is that with a pass through fold_assoc() an
ADD_INT op becomes unused, but isn't removed prior to GCM. GCM then moves it up
to the front of the shader (because there are no users), where the op's src
values aren't defined (in that particular case the loop counter variable). GCM
also moves ops up, if the usage count isn't fulfilled yet. Well that's when
things get really broken, since it seems to move the loop counter -- or at
least the initializer -- to fulfill the usage count. And well, then the GPU
finally locks up on the shader (or if mesa is compiled in debug mode, sb shows
unset registers), probably due to endlessly looping.
I tried to fix GCM, but everytime I thought I've did the right thing, I got
either unscheduled ops or wrong levels for the basic blocks. Also, the
DONT_HOIST stuff doesn't really seem to work that well either.
So I decided to fix the input feeded into the GCM pass, by iteratively removing
all unused ops in dce_cleanup. This could also be reducing amount of
instructions, that weren't actually removed before. Also optimized valtable's
use_count(), which gets called 1500+ times for the octodad trace and did
iterate over the whole use_info list every time...
The (untidied) patch fixes octodad for me. Would be nice, if someone could test
the other problematic games (be sure to test with a debug build, to get an
exception rather than a lockup). If it works there as well, I'd clean things
up.
@Marek, what's the best/usual way to test for performance/instruction count in
mesa changes. I noticed those 'helped'/'hurt'/'+-%' infos and some runtime
numbers in commit messages, but I don't know how they are produced :/</pre>
</div>
</p>
<hr>
<span>You are receiving this mail because:</span>
<ul>
<li>You are the assignee for the bug.</li>
</ul>
</body>
</html>