On Wed, Feb 11, 2015 at 2:36 PM, Eric Anholt <e...@anholt.net> wrote: > Connor Abbott <cwabbo...@gmail.com> writes: > >> On Tue, Feb 10, 2015 at 1:32 PM, Eric Anholt <e...@anholt.net> wrote: >>> Connor Abbott <cwabbo...@gmail.com> writes: >>> >>>> On Sat, Feb 7, 2015 at 12:16 AM, Eric Anholt <e...@anholt.net> wrote: >>>>> NIR instruction count results on i965: >>>>> total instructions in shared programs: 1261954 -> 1261937 (-0.00%) >>>>> instructions in affected programs: 455 -> 438 (-3.74%) >>>>> >>>>> One in yofrankie, two in tropics. Apparently i965 had also optimized all >>>>> of these out anyway. >>>>> --- >>>>> src/glsl/nir/nir_opt_cse.c | 43 >>>>> +++++++++++++++++++++++++++++++++++++++---- >>>>> 1 file changed, 39 insertions(+), 4 deletions(-) >>>>> >>>>> diff --git a/src/glsl/nir/nir_opt_cse.c b/src/glsl/nir/nir_opt_cse.c >>>>> index b3e9c0d..55dc083 100644 >>>>> --- a/src/glsl/nir/nir_opt_cse.c >>>>> +++ b/src/glsl/nir/nir_opt_cse.c >>>>> @@ -80,8 +80,41 @@ nir_instrs_equal(nir_instr *instr1, nir_instr *instr2) >>>>> } >>>>> return true; >>>>> } >>>>> - case nir_instr_type_tex: >>>>> - return false; >>>>> + case nir_instr_type_tex: { >>>>> + nir_tex_instr *tex1 = nir_instr_as_tex(instr1); >>>>> + nir_tex_instr *tex2 = nir_instr_as_tex(instr2); >>>>> + >>>>> + if (tex1->op != tex2->op) >>>>> + return false; >>>>> + >>>>> + if (tex1->num_srcs != tex2->num_srcs) >>>>> + return false; >>>>> + for (unsigned i = 0; i < tex1->num_srcs; i++) { >>>>> + if (tex1->src[i].src_type != tex2->src[i].src_type || >>>>> + !nir_srcs_equal(tex1->src[i].src, tex2->src[i].src)) { >>>>> + return false; >>>>> + } >>>>> + } >>>>> + >>>>> + if (tex1->coord_components != tex2->coord_components || >>>>> + tex1->sampler_dim != tex2->sampler_dim || >>>>> + tex1->is_array != tex2->is_array || >>>>> + tex1->is_shadow != tex2->is_shadow || >>>>> + tex1->is_new_style_shadow != tex2->is_new_style_shadow || >>>>> + memcmp(tex1->const_offset, tex2->const_offset, >>>>> + sizeof(tex1->const_offset)) != 0 || >>>>> + tex1->component != tex2->component || >>>>> + tex1->sampler_index != tex2->sampler_index || >>>>> + tex1->sampler_array_size != tex2->sampler_array_size) { >>>> >>>> I think some of these fields are sometimes unused, so you need to >>>> split them out and not check them if they're unused. For example, >>>> is_new_style_shadow is only used when is_shadow is true, and component >>>> isn't used if we're not doing a textureGather (?) op -- I don't >>>> remember all the details. That, or we have to have a defined value for >>>> these fields when they're unused and document that somewhere. >>> >>> Oh god, we don't zero-allocate structures. This is going to be awful. >> >> No, with valgrind it's actually better... you get an error if you >> don't know what you're doing rather than silently having it ignored. >> These days, zero-allocating structures by default doesn't make much >> sense any more. > > So, why should nir.c not be zero-filling those fields, when we zero fill > the nir_dests and nir_srcs and and tex->sampler and tex->sampler_index > and deref->base_offset?
because in 99% of cases, that's what we want. To be clear, I'm not against initializing stuff to some default value when it makes sense, and in this case I'm fine with initializing all the sometimes-used things to 0 and ensuring that they stay 0 to make comparing tex_instr's less of a PITA. But I don't think we should be blindly calling calloc()/rzalloc() on everything; if there's some field the caller has to set, and there's no default value that 99% of callers will want, don't set it and then let valgrind find any errors (or, even better, pass it as a parameter to the constructor). And yes, there are probably a few places where we initialize stuff when it's not necessary -- that's a mistake on my part. _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev