<div dir="ltr"><div>LGTM.  I would still rather do the allocation in live_variables not on the stack, but I can clean that up later.<br><br></div>Reviewed-by: Jason Ekstrand <<a href="mailto:jason.ekstrand@intel.com">jason.ekstrand@intel.com</a>><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Mar 3, 2015 at 5:19 AM, Jose Fonseca <span dir="ltr"><<a href="mailto:jfonseca@vmware.com" target="_blank">jfonseca@vmware.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">v2:<br>
- Single statement, by using memset return value as suggested by Ian<br>
Romanick.<br>
- No internal declaration, as suggested by Jason Ekstrand.<br>
- Move macros to a header.<br>
---<br>
 src/glsl/nir/nir_from_ssa.c          | 23 ++++++---------<br>
 src/glsl/nir/nir_live_variables.c    |  4 +--<br>
 src/glsl/nir/nir_lower_vars_to_ssa.c | 12 +++-----<br>
 src/glsl/nir/nir_vla.h               | 54 ++++++++++++++++++++++++++++++++++++<br>
 4 files changed, 69 insertions(+), 24 deletions(-)<br>
 create mode 100644 src/glsl/nir/nir_vla.h<br>
<br>
diff --git a/src/glsl/nir/nir_from_ssa.c b/src/glsl/nir/nir_from_ssa.c<br>
index 66339f3..c3090fb 100644<br>
--- a/src/glsl/nir/nir_from_ssa.c<br>
+++ b/src/glsl/nir/nir_from_ssa.c<br>
@@ -26,7 +26,7 @@<br>
  */<br>
<br>
 #include "nir.h"<br>
-#include "c99_alloca.h"<br>
+#include "nir_vla.h"<br>
<br>
 /*<br>
  * This file implements an out-of-SSA pass as described in "Revisiting<br>
@@ -182,7 +182,7 @@ merge_merge_sets(merge_set *a, merge_set *b)<br>
 static bool<br>
 merge_sets_interfere(merge_set *a, merge_set *b)<br>
 {<br>
-   merge_node **dom = alloca((a->size + b->size) * sizeof *dom);<br>
+   NIR_VLA(merge_node *, dom, a->size + b->size);<br>
    int dom_idx = -1;<br>
<br>
    struct exec_node *an = exec_list_get_head(&a->nodes);<br>
@@ -674,21 +674,16 @@ resolve_parallel_copy(nir_parallel_copy_instr *pcopy,<br>
    }<br>
<br>
    /* The register/source corresponding to the given index */<br>
-   nir_src *values = alloca(num_copies * 2 * sizeof *values);<br>
-   memset(values, 0, num_copies * 2 * sizeof *values);<br>
+   NIR_VLA_ZERO(nir_src, values, num_copies * 2);<br>
<br>
-   /* The current location of a given piece of data */<br>
-   int *loc = alloca(num_copies * 2 * sizeof *loc);<br>
+   /* The current location of a given piece of data.  We will use -1 for "null" */<br>
+   NIR_VLA_FILL(int, loc, num_copies * 2, -1);<br>
<br>
-   /* The piece of data that the given piece of data is to be copied from */<br>
-   int *pred = alloca(num_copies * 2 * sizeof *pred);<br>
-<br>
-   /* Initialize loc and pred.  We will use -1 for "null" */<br>
-   memset(loc, -1, num_copies * 2 * sizeof *loc);<br>
-   memset(pred, -1, num_copies * 2 * sizeof *pred);<br>
+   /* The piece of data that the given piece of data is to be copied from.  We will use -1 for "null" */<br>
+   NIR_VLA_FILL(int, pred, num_copies * 2, -1);<br>
<br>
    /* The destinations we have yet to properly fill */<br>
-   int *to_do = alloca(num_copies * 2 * sizeof *to_do);<br>
+   NIR_VLA(int, to_do, num_copies * 2);<br>
    int to_do_idx = -1;<br>
<br>
    /* Now we set everything up:<br>
@@ -738,7 +733,7 @@ resolve_parallel_copy(nir_parallel_copy_instr *pcopy,<br>
    }<br>
<br>
    /* Currently empty destinations we can go ahead and fill */<br>
-   int *ready = alloca(num_copies * 2 * sizeof *ready);<br>
+   NIR_VLA(int, ready, num_copies * 2);<br>
    int ready_idx = -1;<br>
<br>
    /* Mark the ones that are ready for copying.  We know an index is a<br>
diff --git a/src/glsl/nir/nir_live_variables.c b/src/glsl/nir/nir_live_variables.c<br>
index b57ca3a..1c96dcf 100644<br>
--- a/src/glsl/nir/nir_live_variables.c<br>
+++ b/src/glsl/nir/nir_live_variables.c<br>
@@ -26,7 +26,7 @@<br>
<br>
 #include "nir.h"<br>
 #include "nir_worklist.h"<br>
-#include "c99_alloca.h"<br>
+#include "nir_vla.h"<br>
<br>
 /*<br>
  * Basic liveness analysis.  This works only in SSA form.<br>
@@ -131,7 +131,7 @@ static bool<br>
 propagate_across_edge(nir_block *pred, nir_block *succ,<br>
                       struct live_variables_state *state)<br>
 {<br>
-   BITSET_WORD *live = alloca(state->bitset_words * sizeof *live);<br>
+   NIR_VLA(BITSET_WORD, live, state->bitset_words);<br>
    memcpy(live, succ->live_in, state->bitset_words * sizeof *live);<br>
<br>
    nir_foreach_instr(succ, instr) {<br>
diff --git a/src/glsl/nir/nir_lower_vars_to_ssa.c b/src/glsl/nir/nir_lower_vars_to_ssa.c<br>
index f54d1b7..9e9a418 100644<br>
--- a/src/glsl/nir/nir_lower_vars_to_ssa.c<br>
+++ b/src/glsl/nir/nir_lower_vars_to_ssa.c<br>
@@ -26,8 +26,7 @@<br>
  */<br>
<br>
 #include "nir.h"<br>
-<br>
-#include "c99_alloca.h"<br>
+#include "nir_vla.h"<br>
<br>
<br>
 struct deref_node {<br>
@@ -902,8 +901,8 @@ rename_variables_block(nir_block *block, struct lower_variables_state *state)<br>
 static void<br>
 insert_phi_nodes(struct lower_variables_state *state)<br>
 {<br>
-   unsigned *work = alloca(state->impl->num_blocks * sizeof *work);<br>
-   unsigned *has_already = alloca(state->impl->num_blocks * sizeof *has_already);<br>
+   NIR_VLA_ZERO(unsigned, work, state->impl->num_blocks);<br>
+   NIR_VLA_ZERO(unsigned, has_already, state->impl->num_blocks);<br>
<br>
    /*<br>
     * Since the work flags already prevent us from inserting a node that has<br>
@@ -913,10 +912,7 @@ insert_phi_nodes(struct lower_variables_state *state)<br>
     * function. So all we need to handle W is an array and a pointer to the<br>
     * next element to be inserted and the next element to be removed.<br>
     */<br>
-   nir_block **W = alloca(state->impl->num_blocks * sizeof *W);<br>
-<br>
-   memset(work, 0, state->impl->num_blocks * sizeof *work);<br>
-   memset(has_already, 0, state->impl->num_blocks * sizeof *has_already);<br>
+   NIR_VLA(nir_block *, W, state->impl->num_blocks);<br>
<br>
    unsigned w_start, w_end;<br>
    unsigned iter_count = 0;<br>
diff --git a/src/glsl/nir/nir_vla.h b/src/glsl/nir/nir_vla.h<br>
new file mode 100644<br>
index 0000000..7537833<br>
--- /dev/null<br>
+++ b/src/glsl/nir/nir_vla.h<br>
@@ -0,0 +1,54 @@<br>
+/**************************************************************************<br>
+ *<br>
+ * Copyright 2015 VMware, Inc.<br>
+ * All Rights Reserved.<br>
+ *<br>
+ * Permission is hereby granted, free of charge, to any person obtaining a<br>
+ * copy of this software and associated documentation files (the<br>
+ * "Software"), to deal in the Software without restriction, including<br>
+ * without limitation the rights to use, copy, modify, merge, publish,<br>
+ * distribute, sub license, and/or sell copies of the Software, and to<br>
+ * permit persons to whom the Software is furnished to do so, subject to<br>
+ * the following conditions:<br>
+ *<br>
+ * The above copyright notice and this permission notice (including the<br>
+ * next paragraph) shall be included in all copies or substantial portions<br>
+ * of the Software.<br>
+ *<br>
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS<br>
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF<br>
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.<br>
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR<br>
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,<br>
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE<br>
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.<br>
+ *<br>
+ **************************************************************************/<br>
+<br>
+#pragma once<br>
+<br>
+<br>
+#include "c99_alloca.h"<br>
+<br>
+<br>
+/* Declare a variable length array, with no initialization */<br>
+#define NIR_VLA(_type, _name, _length) \<br>
+   _type *_name = alloca((_length) * sizeof *_name)<br>
+<br>
+<br>
+/* Declare a variable length array, and initialize it with the given byte.<br>
+ *<br>
+ * _length is evaluated twice, so expressions with side-effects must be<br>
+ * avoided.<br>
+ */<br>
+#define NIR_VLA_FILL(_type, _name, _length, _byte) \<br>
+   _type *_name = memset(alloca((_length) * sizeof *_name), _byte, (_length) * sizeof *_name)<br>
+<br>
+<br>
+/* Declare a variable length array, and zero it.<br>
+ *<br>
+ * Just like NIR_VLA_FILL, _length is evaluated twice, so expressions with<br>
+ * side-effects must be avoided.<br>
+ */<br>
+#define NIR_VLA_ZERO(_type, _name, _length) \<br>
+   NIR_VLA_FILL(_type, _name, _length, 0)<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.1.0<br>
<br>
</font></span></blockquote></div><br></div>