diff options
author | Timothy Arceri <[email protected]> | 2019-02-22 16:59:13 +1100 |
---|---|---|
committer | Timothy Arceri <[email protected]> | 2019-02-23 11:11:51 +1100 |
commit | f48527e51ac54d4f0ae0db3dbc1acd1c64eb70b4 (patch) | |
tree | 0c63db1676da1f2a810970be6c0aa018895cea09 /src/compiler/nir | |
parent | 6053499f2eafde606b13a9663016e9be8e4089eb (diff) |
nir: allow nir_lower_phis_to_scalar() on more src types
Rather than only lowering if all srcs are scalarizable we instead
check that at least one src is scalarizable.
We change undef type to return false otherwise it will cause
regressions when it is the only scalarizable src.
total instructions in shared programs: 13219105 -> 13024547 (-1.47%)
instructions in affected programs: 1153797 -> 959239 (-16.86%)
helped: 581
HURT: 74
total cycles in shared programs: 333968972 -> 324807922 (-2.74%)
cycles in affected programs: 129809402 -> 120648352 (-7.06%)
helped: 571
HURT: 131
total spills in shared programs: 57947 -> 29130 (-49.73%)
spills in affected programs: 53364 -> 24547 (-54.00%)
helped: 351
HURT: 0
total fills in shared programs: 51310 -> 25468 (-50.36%)
fills in affected programs: 44882 -> 19040 (-57.58%)
helped: 351
HURT: 0
Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src/compiler/nir')
-rw-r--r-- | src/compiler/nir/nir_lower_phis_to_scalar.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/compiler/nir/nir_lower_phis_to_scalar.c b/src/compiler/nir/nir_lower_phis_to_scalar.c index 16001f73685..c58a67826ce 100644 --- a/src/compiler/nir/nir_lower_phis_to_scalar.c +++ b/src/compiler/nir/nir_lower_phis_to_scalar.c @@ -75,10 +75,15 @@ is_phi_src_scalarizable(nir_phi_src *src, return should_lower_phi(nir_instr_as_phi(src_instr), state); case nir_instr_type_load_const: - case nir_instr_type_ssa_undef: /* These are trivially scalarizable */ return true; + case nir_instr_type_ssa_undef: + /* The caller of this function is going to OR the results and we don't + * want undefs to count so we return false. + */ + return false; + case nir_instr_type_intrinsic: { nir_intrinsic_instr *src_intrin = nir_instr_as_intrinsic(src_instr); @@ -150,11 +155,16 @@ should_lower_phi(nir_phi_instr *phi, struct lower_phis_to_scalar_state *state) */ entry = _mesa_hash_table_insert(state->phi_table, phi, (void *)(intptr_t)1); - bool scalarizable = true; + bool scalarizable = false; nir_foreach_phi_src(src, phi) { + /* This loop ignores srcs that are not scalarizable because its likely + * still worth copying to temps if another phi source is scalarizable. + * This reduces register spilling by a huge amount in the i965 driver for + * Deus Ex: MD. + */ scalarizable = is_phi_src_scalarizable(src, state); - if (!scalarizable) + if (scalarizable) break; } |