aco: Fix crash in insert_wait_states.
authorTimur Kristóf <timur.kristof@gmail.com>
Mon, 6 Apr 2020 14:34:45 +0000 (16:34 +0200)
committerMarge Bot <eric+marge@anholt.net>
Tue, 7 Apr 2020 09:51:14 +0000 (09:51 +0000)
Signed-off-by: Timur Kristóf <timur.kristof@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4465>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4465>

src/amd/compiler/aco_insert_waitcnt.cpp

index fc874ae793cea9db77966718284b828ed23b320e..e4087e7add59b8f007c20c18050632858be0402a 100644 (file)
@@ -869,14 +869,14 @@ void handle_block(Program *program, Block& block, wait_ctx& ctx)
 
 } /* end namespace */
 
-static uint32_t calculate_score(unsigned num_ctx, wait_ctx *ctx, uint32_t event_mask)
+static uint32_t calculate_score(std::vector<wait_ctx> &ctx_vec, uint32_t event_mask)
 {
    double result = 0.0;
    unsigned num_waits = 0;
    while (event_mask) {
       unsigned event_index = u_bit_scan(&event_mask);
-      for (unsigned i = 0; i < num_ctx; i++) {
-         for (unsigned dist : ctx[i].wait_distances[event_index]) {
+      for (const wait_ctx &ctx : ctx_vec) {
+         for (unsigned dist : ctx.wait_distances[event_index]) {
             double score = dist;
             /* for many events, excessive distances provide little benefit, so
              * decrease the score in that case. */
@@ -918,11 +918,9 @@ void insert_wait_states(Program* program)
 {
    /* per BB ctx */
    std::vector<bool> done(program->blocks.size());
-   wait_ctx in_ctx[program->blocks.size()];
-   wait_ctx out_ctx[program->blocks.size()];
+   std::vector<wait_ctx> in_ctx(program->blocks.size(), wait_ctx(program));
+   std::vector<wait_ctx> out_ctx(program->blocks.size(), wait_ctx(program));
 
-   for (unsigned i = 0; i < program->blocks.size(); i++)
-      in_ctx[i] = wait_ctx(program);
    std::stack<unsigned> loop_header_indices;
    unsigned loop_progress = 0;
 
@@ -972,9 +970,9 @@ void insert_wait_states(Program* program)
 
    if (program->collect_statistics) {
       program->statistics[statistic_vmem_score] =
-         calculate_score(program->blocks.size(), out_ctx, event_vmem | event_flat | event_vmem_store);
+         calculate_score(out_ctx, event_vmem | event_flat | event_vmem_store);
       program->statistics[statistic_smem_score] =
-         calculate_score(program->blocks.size(), out_ctx, event_smem);
+         calculate_score(out_ctx, event_smem);
    }
 }