glsl: merge loop_controls.cpp with loop_unroll.cpp
authorTimothy Arceri <tarceri@itsqueeze.com>
Tue, 19 Sep 2017 02:14:12 +0000 (12:14 +1000)
committerTimothy Arceri <tarceri@itsqueeze.com>
Thu, 21 Sep 2017 01:56:21 +0000 (11:56 +1000)
Having this separate just makes the code harder to follow, and
requires an extra walk of the IR.

Reviewed-by: Thomas Helland <thomashelland90@gmail.com>
src/compiler/Makefile.sources
src/compiler/glsl/glsl_parser_extras.cpp
src/compiler/glsl/loop_analysis.h
src/compiler/glsl/loop_controls.cpp [deleted file]
src/compiler/glsl/loop_unroll.cpp

index 0153df2d812c2398497581fe1a5baf0f156954e8..0e9a84e87cb44283584f79bdf692878ac17c13a1 100644 (file)
@@ -80,7 +80,6 @@ LIBGLSL_FILES = \
        glsl/list.h \
        glsl/loop_analysis.cpp \
        glsl/loop_analysis.h \
-       glsl/loop_controls.cpp \
        glsl/loop_unroll.cpp \
        glsl/lower_blend_equation_advanced.cpp \
        glsl/lower_buffer_access.cpp \
index 2c42716ade78fd46d19fe4ad21a9c2e6af4e3b8f..9cbc2355f9dafd97374869c87bf389dbf478d726 100644 (file)
@@ -2216,7 +2216,6 @@ do_common_optimization(exec_list *ir, bool linked,
    if (options->MaxUnrollIterations) {
       loop_state *ls = analyze_loop_variables(ir);
       if (ls->loop_found) {
-         OPT(set_loop_controls, ir, ls);
          OPT(unroll_loops, ir, ls, options);
       }
       delete ls;
index e2eff9dbaed6c1baaf6b2ef283abca55f0879c29..8f8240469451e43ca8968e26f4110e13f4e8af97 100644 (file)
@@ -35,22 +35,6 @@ extern class loop_state *
 analyze_loop_variables(exec_list *instructions);
 
 
-/**
- * Fill in loop control fields
- *
- * Based on analysis of loop variables, this function tries to remove
- * redundant sequences in the loop of the form
- *
- *  (if (expression bool ...) (break))
- *
- * For example, if it is provable that one loop exit condition will
- * always be satisfied before another, the unnecessary exit condition will be
- * removed.
- */
-extern bool
-set_loop_controls(exec_list *instructions, loop_state *ls);
-
-
 extern bool
 unroll_loops(exec_list *instructions, loop_state *ls,
              const struct gl_shader_compiler_options *options);
diff --git a/src/compiler/glsl/loop_controls.cpp b/src/compiler/glsl/loop_controls.cpp
deleted file mode 100644 (file)
index ad4aa18..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright © 2010 Intel Corporation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#include <limits.h>
-#include "main/compiler.h"
-#include "compiler/glsl_types.h"
-#include "loop_analysis.h"
-#include "ir_hierarchical_visitor.h"
-
-
-namespace {
-
-class loop_control_visitor : public ir_hierarchical_visitor {
-public:
-   loop_control_visitor(loop_state *state)
-   {
-      this->state = state;
-      this->progress = false;
-   }
-
-   virtual ir_visitor_status visit_leave(ir_loop *ir);
-
-   loop_state *state;
-
-   bool progress;
-};
-
-} /* anonymous namespace */
-
-ir_visitor_status
-loop_control_visitor::visit_leave(ir_loop *ir)
-{
-   loop_variable_state *const ls = this->state->get(ir);
-
-   /* If we've entered a loop that hasn't been analyzed, something really,
-    * really bad has happened.
-    */
-   if (ls == NULL) {
-      assert(ls != NULL);
-      return visit_continue;
-   }
-
-   if (ls->limiting_terminator != NULL) {
-      /* If the limiting terminator has an iteration count of zero, then we've
-       * proven that the loop cannot run, so delete it.
-       */
-      int iterations = ls->limiting_terminator->iterations;
-      if (iterations == 0) {
-         ir->remove();
-         this->progress = true;
-         return visit_continue;
-      }
-   }
-
-   /* Remove the conditional break statements associated with all terminators
-    * that are associated with a fixed iteration count, except for the one
-    * associated with the limiting terminator--that one needs to stay, since
-    * it terminates the loop.  Exception: if the loop still has a normative
-    * bound, then that terminates the loop, so we don't even need the limiting
-    * terminator.
-    */
-   foreach_in_list(loop_terminator, t, &ls->terminators) {
-      if (t->iterations < 0)
-         continue;
-
-      if (t != ls->limiting_terminator) {
-         t->ir->remove();
-
-         assert(ls->num_loop_jumps > 0);
-         ls->num_loop_jumps--;
-
-         this->progress = true;
-      }
-   }
-
-   return visit_continue;
-}
-
-
-bool
-set_loop_controls(exec_list *instructions, loop_state *ls)
-{
-   loop_control_visitor v(ls);
-
-   v.run(instructions);
-
-   return v.progress;
-}
index dbb3fa2fa5cfb3f478f062e16376b59624d493d2..7eea439454b4e5208f7b5404fc5cdca118854b97 100644 (file)
@@ -305,7 +305,6 @@ ir_visitor_status
 loop_unroll_visitor::visit_leave(ir_loop *ir)
 {
    loop_variable_state *const ls = this->state->get(ir);
-   int iterations;
 
    /* If we've entered a loop that hasn't been analyzed, something really,
     * really bad has happened.
@@ -315,6 +314,39 @@ loop_unroll_visitor::visit_leave(ir_loop *ir)
       return visit_continue;
    }
 
+   if (ls->limiting_terminator != NULL) {
+      /* If the limiting terminator has an iteration count of zero, then we've
+       * proven that the loop cannot run, so delete it.
+       */
+      int iterations = ls->limiting_terminator->iterations;
+      if (iterations == 0) {
+         ir->remove();
+         this->progress = true;
+         return visit_continue;
+      }
+   }
+
+   /* Remove the conditional break statements associated with all terminators
+    * that are associated with a fixed iteration count, except for the one
+    * associated with the limiting terminator--that one needs to stay, since
+    * it terminates the loop.  Exception: if the loop still has a normative
+    * bound, then that terminates the loop, so we don't even need the limiting
+    * terminator.
+    */
+   foreach_in_list(loop_terminator, t, &ls->terminators) {
+      if (t->iterations < 0)
+         continue;
+
+      if (t != ls->limiting_terminator) {
+         t->ir->remove();
+
+         assert(ls->num_loop_jumps > 0);
+         ls->num_loop_jumps--;
+
+         this->progress = true;
+      }
+   }
+
    if (ls->limiting_terminator == NULL) {
       ir_instruction *last_ir =
          (ir_instruction *) ir->body_instructions.get_tail();
@@ -343,7 +375,7 @@ loop_unroll_visitor::visit_leave(ir_loop *ir)
       return visit_continue;
    }
 
-   iterations = ls->limiting_terminator->iterations;
+   int iterations = ls->limiting_terminator->iterations;
 
    const int max_iterations = options->MaxUnrollIterations;