r300/compiler: Fix error in OMOD optimization
authorTom Stellard <tstellar@gmail.com>
Sat, 1 Oct 2011 22:22:24 +0000 (15:22 -0700)
committerTom Stellard <tstellar@gmail.com>
Sun, 2 Oct 2011 22:21:15 +0000 (15:21 -0700)
commitd64c6d2ffc086bde7a025269b80c0980f7d908f1
tree1217548ef93e5e16d0562d6097ed8a331d0c0093
parent13814b0103812adbb5aba0dba4664249e8566290
r300/compiler: Fix error in OMOD optimization

Classic compiler mistake.  In the example below, the OMOD optimization
was combining instructions 4 and 10, but since there was an instruction
(#8) in between them that wrote to the same registers as instruction 10,
instruction 11 was reading the wrong value.

Example of the mistake:

Before OMOD:
4: MAD temp[0].y, temp[3]._y__, const[0]._x__, const[0]._y__;
...
8: ADD temp[2].x, temp[1].x___, -temp[4].x___;
...
10: MUL temp[2].x, const[1].y___, temp[0].y___;
11: FRC temp[5].x, temp[2].x___;

After OMOD:
4: MAD temp[2].x / 8, temp[3]._y__, const[0]._x__, const[0]._y__;
...
8: ADD temp[2].x, temp[1].x___, -temp[4].x___;
...
11: FRC temp[5].x, temp[2].x___;

https://bugs.freedesktop.org/show_bug.cgi?id=41367
src/gallium/drivers/r300/compiler/radeon_optimize.c