<div dir="ltr">Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Mar 22, 2016 at 12:35 PM, Rob Clark <span dir="ltr"><<a href="mailto:robdclark@gmail.com" target="_blank">robdclark@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Rob Clark <<a href="mailto:robclark@freedesktop.org">robclark@freedesktop.org</a>><br>
<br>
In many places, the convention is to pass an existing ssadef name ptr<br>
when construction/initializing a new nir_ssa_def.  But that goes badly<br>
(as noticed by garbage in nir_print output) when the original string<br>
gets freed.<br>
<br>
Just use ralloc_strdup() instead, and add ralloc_free() in the two<br>
places that would care (not that the strings wouldn't eventually get<br>
freed anyways).<br>
<br>
Also fixup the nir_search code which was directly setting ssadef->name<br>
to use the parent instruction as memctx.<br>
<br>
Signed-off-by: Rob Clark <<a href="mailto:robclark@freedesktop.org">robclark@freedesktop.org</a>><br>
---<br>
 src/compiler/nir/nir.c        | 4 +++-<br>
 src/compiler/nir/nir_search.c | 6 +++---<br>
 src/compiler/nir/nir_to_ssa.c | 2 ++<br>
 3 files changed, 8 insertions(+), 4 deletions(-)<br>
<br>
diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c<br>
index b114981..20f1a18 100644<br>
--- a/src/compiler/nir/nir.c<br>
+++ b/src/compiler/nir/nir.c<br>
@@ -1317,12 +1317,13 @@ nir_instr_rewrite_dest(nir_instr *instr, nir_dest *dest, nir_dest new_dest)<br>
       src_add_all_uses(dest->reg.indirect, instr, NULL);<br>
 }<br>
<br>
+/* note: does *not* take ownership of 'name' */<br>
 void<br>
 nir_ssa_def_init(nir_instr *instr, nir_ssa_def *def,<br>
                  unsigned num_components,<br>
                  unsigned bit_size, const char *name)<br>
 {<br>
-   def->name = name;<br>
+   def->name = ralloc_strdup(instr, name);<br>
    def->parent_instr = instr;<br>
    list_inithead(&def->uses);<br>
    list_inithead(&def->if_uses);<br>
@@ -1339,6 +1340,7 @@ nir_ssa_def_init(nir_instr *instr, nir_ssa_def *def,<br>
    }<br>
 }<br>
<br>
+/* note: does *not* take ownership of 'name' */<br>
 void<br>
 nir_ssa_dest_init(nir_instr *instr, nir_dest *dest,<br>
                  unsigned num_components, unsigned bit_size,<br>
diff --git a/src/compiler/nir/nir_search.c b/src/compiler/nir/nir_search.c<br>
index 6df662a..842ff65 100644<br>
--- a/src/compiler/nir/nir_search.c<br>
+++ b/src/compiler/nir/nir_search.c<br>
@@ -464,7 +464,7 @@ construct_value(const nir_search_value *value,<br>
<br>
       switch (c->type) {<br>
       case nir_type_float:<br>
-         load-><a href="http://def.name" rel="noreferrer" target="_blank">def.name</a> = ralloc_asprintf(mem_ctx, "%f", c->data.d);<br>
+         load-><a href="http://def.name" rel="noreferrer" target="_blank">def.name</a> = ralloc_asprintf(load, "%f", c->data.d);<br>
          switch (bitsize->dest_size) {<br>
          case 32:<br>
             load->value.f32[0] = c->data.d;<br>
@@ -478,7 +478,7 @@ construct_value(const nir_search_value *value,<br>
          break;<br>
<br>
       case nir_type_int:<br>
-         load-><a href="http://def.name" rel="noreferrer" target="_blank">def.name</a> = ralloc_asprintf(mem_ctx, "%ld", c->data.i);<br>
+         load-><a href="http://def.name" rel="noreferrer" target="_blank">def.name</a> = ralloc_asprintf(load, "%ld", c->data.i);<br>
          switch (bitsize->dest_size) {<br>
          case 32:<br>
             load->value.i32[0] = c->data.i;<br>
@@ -492,7 +492,7 @@ construct_value(const nir_search_value *value,<br>
          break;<br>
<br>
       case nir_type_uint:<br>
-         load-><a href="http://def.name" rel="noreferrer" target="_blank">def.name</a> = ralloc_asprintf(mem_ctx, "%lu", c->data.u);<br>
+         load-><a href="http://def.name" rel="noreferrer" target="_blank">def.name</a> = ralloc_asprintf(load, "%lu", c->data.u);<br>
          switch (bitsize->dest_size) {<br>
          case 32:<br>
             load->value.u32[0] = c->data.u;<br>
diff --git a/src/compiler/nir/nir_to_ssa.c b/src/compiler/nir/nir_to_ssa.c<br>
index 0640607..d588d7d 100644<br>
--- a/src/compiler/nir/nir_to_ssa.c<br>
+++ b/src/compiler/nir/nir_to_ssa.c<br>
@@ -221,6 +221,7 @@ rewrite_def_forwards(nir_dest *dest, void *_state)<br>
    list_del(&dest->reg.def_link);<br>
    nir_ssa_dest_init(state->parent_instr, dest, reg->num_components,<br>
                      reg->bit_size, name);<br>
+   ralloc_free(name);<br>
<br>
    /* push our SSA destination on the stack */<br>
    state->states[index].index++;<br>
@@ -274,6 +275,7 @@ rewrite_alu_instr_forward(nir_alu_instr *instr, rewrite_state *state)<br>
       list_del(&instr->dest.dest.reg.def_link);<br>
       nir_ssa_dest_init(&instr->instr, &instr->dest.dest, num_components,<br>
                         reg->bit_size, name);<br>
+      ralloc_free(name);<br>
<br>
       if (nir_op_infos[instr->op].output_size == 0) {<br>
          /*<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.5.0<br>
<br>
</font></span></blockquote></div><br></div>