X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fnir%2Fnir_lower_phis_to_scalar.c;h=45894dee352f4c28e0176cd4dc2735d8707a83c8;hb=a18c4ee7b07cb0c78b7d93005cc76eded4e8001c;hp=41ae19e8391759316832d029cf7ba2d7b7bfa445;hpb=ca8c6c97814043644b4513a8ca79c3d2af2ed7ef;p=mesa.git diff --git a/src/compiler/nir/nir_lower_phis_to_scalar.c b/src/compiler/nir/nir_lower_phis_to_scalar.c index 41ae19e8391..45894dee352 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); @@ -88,15 +93,18 @@ is_phi_src_scalarizable(nir_phi_src *src, return deref->mode == nir_var_shader_in || deref->mode == nir_var_uniform || deref->mode == nir_var_mem_ubo || - deref->mode == nir_var_mem_ssbo; + deref->mode == nir_var_mem_ssbo || + deref->mode == nir_var_mem_global; } case nir_intrinsic_interp_deref_at_centroid: case nir_intrinsic_interp_deref_at_sample: case nir_intrinsic_interp_deref_at_offset: + case nir_intrinsic_interp_deref_at_vertex: case nir_intrinsic_load_uniform: case nir_intrinsic_load_ubo: case nir_intrinsic_load_ssbo: + case nir_intrinsic_load_global: case nir_intrinsic_load_input: return true; default: @@ -148,11 +156,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; } @@ -223,7 +236,7 @@ lower_phis_to_scalar_block(nir_block *block, nir_foreach_phi_src(src, phi) { /* We need to insert a mov to grab the i'th component of src */ nir_alu_instr *mov = nir_alu_instr_create(state->mem_ctx, - nir_op_imov); + nir_op_mov); nir_ssa_dest_init(&mov->instr, &mov->dest.dest, 1, bit_size, NULL); mov->dest.write_mask = 1; nir_src_copy(&mov->src[0].src, &src->src, state->mem_ctx);