r300: allow more copy propagation with relative addressing

We are now extremelly careful when copy propagating a mov that uses
relative addressing. The search for readers will trigger abort when it
sees any other instruction using a relative addressing, irrespective of
the actual used registers or whether an address register load was seen.

Additionally, since ntt switch all movs using the relative addressing are
actually used only once right on the next line, and are result of ntt converting

vec4 32 ssa_10 = intrinsic load_ubo_vec4 (ssa_0, ssa_9) (access=0, base=11, component=0)

into

  5: ARL ADDR[0].x, TEMP[0].xxxx
  6: MOV TEMP[2], CONST[0][ADDR[0].x+11]

RV530 shader-db:
total instructions in shared programs: 132966 -> 131904 (-0.80%)
instructions in affected programs: 29896 -> 28834 (-3.55%)
helped: 234
HURT: 2
total temps in shared programs: 16969 -> 16905 (-0.38%)
temps in affected programs: 604 -> 540 (-10.60%)
helped: 68
HURT: 12

Partial fix for: https://gitlab.freedesktop.org/mesa/mesa/-/issues/7723

Signed-off-by: Pavel Ondračka <pavel.ondracka@gmail.com>
Reviewed-by: Filip Gawin <filip@gawin.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20577>
This commit is contained in:
Pavel Ondračka
2022-11-21 11:20:28 +01:00
committed by Marge Bot
parent 2b28983c5d
commit 7ab7b9770e

View File

@@ -511,18 +511,12 @@ static void add_reader_pair(
static unsigned int get_readers_read_callback(
struct get_readers_callback_data * cb_data,
unsigned int has_rel_addr,
rc_register_file file,
unsigned int index,
unsigned int swizzle)
{
unsigned int shared_mask, read_mask;
if (has_rel_addr) {
cb_data->ReaderData->Abort = 1;
return RC_MASK_NONE;
}
shared_mask = rc_src_reads_dst_mask(file, index, swizzle,
cb_data->DstFile, cb_data->DstIndex, cb_data->AliveWriteMask);
@@ -562,7 +556,6 @@ static void get_readers_pair_read_callback(
struct get_readers_callback_data * d = userdata;
shared_mask = get_readers_read_callback(d,
0 /*Pair Instructions don't use RelAddr*/,
src->File, src->Index, arg->Swizzle);
if (shared_mask == RC_MASK_NONE)
@@ -590,7 +583,7 @@ static void get_readers_normal_read_callback(
unsigned int shared_mask;
shared_mask = get_readers_read_callback(d,
src->RelAddr, src->File, src->Index, src->Swizzle);
src->File, src->Index, src->Swizzle);
if (shared_mask == RC_MASK_NONE)
return;