nir/gcm: fix a bug with metadata handling
authorConnor Abbott <cwabbott0@gmail.com>
Sat, 14 Jan 2017 23:08:11 +0000 (18:08 -0500)
committerConnor Abbott <cwabbott0@gmail.com>
Sat, 14 Jan 2017 23:18:17 +0000 (18:18 -0500)
We were using impl->num_blocks, but that isn't guaranteed to be
up-to-date until after the block_index metadata is required. If we were
unlucky, this could lead to overwriting memory.

Noticed by inspection.

Signed-off-by: Connor Abbott <cwabbott0@gmail.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/compiler/nir/nir_opt_gcm.c

index cff2315da30d6141be68335d301b8bd3b4c3d5ab..879a77a884b046e8b307d97996a46a9f745cfb9c 100644 (file)
@@ -456,6 +456,9 @@ gcm_place_instr(nir_instr *instr, struct gcm_state *state)
 static bool
 opt_gcm_impl(nir_function_impl *impl, bool value_number)
 {
+   nir_metadata_require(impl, nir_metadata_block_index |
+                              nir_metadata_dominance);
+
    struct gcm_state state;
 
    state.impl = impl;
@@ -463,9 +466,6 @@ opt_gcm_impl(nir_function_impl *impl, bool value_number)
    exec_list_make_empty(&state.instrs);
    state.blocks = rzalloc_array(NULL, struct gcm_block_info, impl->num_blocks);
 
-   nir_metadata_require(impl, nir_metadata_block_index |
-                              nir_metadata_dominance);
-
    gcm_build_block_info(&impl->body, &state, 0);
 
    nir_foreach_block(block, impl) {