r300: dEQP-GLES2.functional.shaders.indexing.tmp_array.float_dynamic_write_dynamic_loop_read_fragment regression
dEQP-GLES2.functional.shaders.indexing.tmp_array.float_dynamic_write_dynamic_loop_read_fragment regressed after 46a9df6a on my RV530. This however looks like a backend problem
This is the TGSI we received before from ntt:
r300: Initial fragment program
FRAG
PROPERTY FS_COLOR0_WRITES_ALL_CBUFS 1
DCL IN[0], GENERIC[9], PERSPECTIVE
DCL OUT[0], COLOR
DCL CONST[0][0..3]
DCL TEMP[0..4]
IMM[0] FLT32 { 0.5000, 0.2500, 0.1250, 0.0000}
IMM[1] FLT32 { 0.0000, 1.0000, 2.0000, 3.0000}
0: MUL TEMP[0].xyz, IN[0].xxxx, IMM[0].xyzx
1: SEQ TEMP[1], CONST[0][0].xxxx, IMM[1]
2: CMP TEMP[1], -TEMP[1], TEMP[0].xxxx, IN[0].xxxx
3: SEQ TEMP[2], CONST[0][1].xxxx, IMM[1]
4: CMP TEMP[1], -TEMP[2], TEMP[0].yyyy, TEMP[1]
5: SEQ TEMP[2], CONST[0][2].xxxx, IMM[1]
6: CMP TEMP[0], -TEMP[2], TEMP[0].zzzz, TEMP[1]
7: MOV TEMP[1].x, IMM[0].wwww
8: MOV TEMP[2].x, TEMP[1]
9: BGNLOOP :0
10: SGE TEMP[3].x, TEMP[1].xxxx, CONST[0][3].xxxx
11: IF TEMP[3].xxxx :13
12: BRK
13: ENDIF
14: SEQ TEMP[3].xyz, TEMP[1].xxxz, IMM[1].yzww
15: CMP TEMP[4].x, -TEMP[3].xxxx, TEMP[0].yyzw, TEMP[0]
16: CMP TEMP[4].x, -TEMP[3].yxxx, TEMP[0].zyzw, TEMP[4].xxxx
17: CMP TEMP[3].x, -TEMP[3].zxxx, TEMP[0].wyzw, TEMP[4].xxxx
18: ADD TEMP[2].x, TEMP[2].xxxx, TEMP[3].xxxx
19: ADD TEMP[1].x, TEMP[1].xxxx, IMM[1].yyyy
20: ENDLOOP :0
21: MOV OUT[0].x, TEMP[2].xxxx
22: MOV OUT[0].yzw, IMM[1].xxxy
23: END
what we receive after is this:
r300: Initial fragment program
FRAG
PROPERTY FS_COLOR0_WRITES_ALL_CBUFS 1
DCL IN[0], GENERIC[9], PERSPECTIVE
DCL OUT[0], COLOR
DCL CONST[0][0..3]
DCL TEMP[0..8]
IMM[0] FLT32 { 0.5000, 0.2500, 0.1250, 0.0000}
IMM[1] FLT32 { 2.0000, 1.0000, 3.0000, 0.0000}
0: MUL TEMP[0].xyz, IN[0].xxxx, IMM[0].xyzx
1: SLT TEMP[1].xyz, CONST[0][0].xxxx, IMM[1].xyzx
2: CMP TEMP[2].x, -TEMP[1].yxxx, IN[0].xxxx, TEMP[0].xyzx
3: CMP TEMP[3].x, -TEMP[1].zxxx, TEMP[0].xyzx, IN[0].xxxx
4: MAX TEMP[4].x, TEMP[1].xxxx, TEMP[1].zxxx
5: CMP TEMP[4].x, -TEMP[4].xxxx, IN[0].xxxx, TEMP[0].xxxx
6: CMP TEMP[3].x, -TEMP[1].xxxx, IN[0].xxxx, TEMP[3].xxxx
7: CMP TEMP[2].x, -TEMP[1].xxxx, TEMP[2].xxxx, IN[0].xxxx
8: MUL TEMP[1].x, TEMP[1].xxxx, TEMP[1].yxxx
9: CMP TEMP[1].x, -TEMP[1].xxxx, TEMP[0].xxxx, IN[0].xxxx
10: SLT TEMP[5].xyz, CONST[0][1].xxxx, IMM[1].xyzx
11: CMP TEMP[6].x, -TEMP[5].yxxx, TEMP[2].xxxx, TEMP[0].yyzx
12: CMP TEMP[7].x, -TEMP[5].zxxx, TEMP[0].yyzx, TEMP[3].xxxx
13: MAX TEMP[8].x, TEMP[5].xxxx, TEMP[5].zxxx
14: CMP TEMP[4].x, -TEMP[8].xxxx, TEMP[4].xxxx, TEMP[0].yxxx
15: CMP TEMP[3].x, -TEMP[5].xxxx, TEMP[3].xxxx, TEMP[7].xxxx
16: CMP TEMP[2].x, -TEMP[5].xxxx, TEMP[6].xxxx, TEMP[2].xxxx
17: MUL TEMP[5].x, TEMP[5].xxxx, TEMP[5].yxxx
18: CMP TEMP[1].x, -TEMP[5].xxxx, TEMP[0].yxxx, TEMP[1].xxxx
19: SLT TEMP[5].xyz, CONST[0][2].xxxx, IMM[1].xyzx
20: CMP TEMP[6].x, -TEMP[5].yxxx, TEMP[2].xxxx, TEMP[0].zyzx
21: CMP TEMP[7].x, -TEMP[5].zxxx, TEMP[0].zyzx, TEMP[3].xxxx
22: MAX TEMP[8].x, TEMP[5].xxxx, TEMP[5].zxxx
23: CMP TEMP[4].x, -TEMP[8].xxxx, TEMP[4].xxxx, TEMP[0].zxxx
24: CMP TEMP[3].x, -TEMP[5].xxxx, TEMP[3].xxxx, TEMP[7].xxxx
25: CMP TEMP[2].x, -TEMP[5].xxxx, TEMP[6].xxxx, TEMP[2].xxxx
26: MUL TEMP[5].x, TEMP[5].xxxx, TEMP[5].yxxx
27: CMP TEMP[0].x, -TEMP[5].xxxx, TEMP[0].zxxx, TEMP[1].xxxx
28: MOV TEMP[1].x, IMM[0].wwww
29: MOV TEMP[5].x, TEMP[1]
30: BGNLOOP :0
31: SGE TEMP[6].x, TEMP[1].xxxx, CONST[0][3].xxxx
32: IF TEMP[6].xxxx :34
33: BRK
34: ENDIF
35: SLT TEMP[6].xyz, TEMP[1].xxxw, IMM[1].xyzx
36: CMP TEMP[7].x, -TEMP[6].yxxx, TEMP[0].xxxx, TEMP[2].xxxx
37: CMP TEMP[8].x, -TEMP[6].zxxx, TEMP[3].xxxx, TEMP[4].xxxx
38: CMP TEMP[6].x, -TEMP[6].xxxx, TEMP[7].xxxx, TEMP[8].xxxx
39: ADD TEMP[5].x, TEMP[5].xxxx, TEMP[6].xxxx
40: ADD TEMP[1].x, TEMP[1].xxxx, IMM[1].yyyy
41: ENDLOOP :0
42: MOV OUT[0].x, TEMP[5].xxxx
43: MOV OUT[0].yzw, IMM[1].wwwy
44: END
Besides the obvious instruction count regression in the frontend, this now uncovers some bug in our backend, specifically in the pair scheduling. Disabling attempts to convert some of the RGB instructions to Alpha and try to pair it with another RGB, i.e., commenting out try_convert_and_pair(s, &s->ReadyRGB);
in pair_instructions
makes this test pass. New logs with my RV530 attached: bad one obtained with 46a9df6a bad.txt and a good one from the same commit with the commented out line: good.txt