nir: Add a find_variable_with_[driver_]location helper
[mesa.git] / src / intel / compiler / brw_vec4_live_variables.h
index 8807c45374348e582a9c33cbd1c086cd7231b8b1..062814329559fe8e2464ad3724eb1d126f914fe8 100644 (file)
  *
  */
 
-#include "util/bitset.h"
-#include "brw_vec4.h"
-
-namespace brw {
-
-struct block_data {
-   /**
-    * Which variables are defined before being used in the block.
-    *
-    * Note that for our purposes, "defined" means unconditionally, completely
-    * defined.
-    */
-   BITSET_WORD *def;
+#ifndef BRW_VEC4_LIVE_VARIABLES_H
+#define BRW_VEC4_LIVE_VARIABLES_H
 
-   /**
-    * Which variables are used before being defined in the block.
-    */
-   BITSET_WORD *use;
-
-   /** Which defs reach the entry point of the block. */
-   BITSET_WORD *livein;
+#include "brw_ir_vec4.h"
+#include "brw_ir_analysis.h"
+#include "util/bitset.h"
 
-   /** Which defs reach the exit point of the block. */
-   BITSET_WORD *liveout;
+struct backend_shader;
 
-   BITSET_WORD flag_def[1];
-   BITSET_WORD flag_use[1];
-   BITSET_WORD flag_livein[1];
-   BITSET_WORD flag_liveout[1];
-};
+namespace brw {
 
 class vec4_live_variables {
 public:
-   DECLARE_RALLOC_CXX_OPERATORS(vec4_live_variables)
-
-   vec4_live_variables(const simple_allocator &alloc, cfg_t *cfg);
+   struct block_data {
+      /**
+       * Which variables are defined before being used in the block.
+       *
+       * Note that for our purposes, "defined" means unconditionally, completely
+       * defined.
+       */
+      BITSET_WORD *def;
+
+      /**
+       * Which variables are used before being defined in the block.
+       */
+      BITSET_WORD *use;
+
+      /** Which defs reach the entry point of the block. */
+      BITSET_WORD *livein;
+
+      /** Which defs reach the exit point of the block. */
+      BITSET_WORD *liveout;
+
+      BITSET_WORD flag_def[1];
+      BITSET_WORD flag_use[1];
+      BITSET_WORD flag_livein[1];
+      BITSET_WORD flag_liveout[1];
+   };
+
+   vec4_live_variables(const backend_shader *s);
    ~vec4_live_variables();
 
+   bool
+   validate(const backend_shader *s) const;
+
+   analysis_dependency_class
+   dependency_class() const
+   {
+      return (DEPENDENCY_INSTRUCTION_IDENTITY |
+              DEPENDENCY_INSTRUCTION_DATA_FLOW |
+              DEPENDENCY_VARIABLES);
+   }
+
    int num_vars;
    int bitset_words;
 
    /** Per-basic-block information on live variables */
    struct block_data *block_data;
 
+   /** @{
+    * Final computed live ranges for each variable.
+    */
+   int *start;
+   int *end;
+   /** @} */
+
+   int var_range_start(unsigned v, unsigned n) const;
+   int var_range_end(unsigned v, unsigned n) const;
+   bool vgrfs_interfere(int a, int b) const;
+
 protected:
    void setup_def_use();
    void compute_live_variables();
+   void compute_start_end();
 
    const simple_allocator &alloc;
    cfg_t *cfg;
@@ -88,7 +115,7 @@ var_from_reg(const simple_allocator &alloc, const src_reg &reg,
    assert(reg.file == VGRF && reg.nr < alloc.count && c < 4);
    const unsigned csize = DIV_ROUND_UP(type_sz(reg.type), 4);
    unsigned result =
-      8 * (alloc.offsets[reg.nr] + reg.offset / REG_SIZE) +
+      8 * alloc.offsets[reg.nr] + reg.offset / 4 +
       (BRW_GET_SWZ(reg.swizzle, c) + k / csize * 4) * csize + k % csize;
    /* Do not exceed the limit for this register */
    assert(result < 8 * (alloc.offsets[reg.nr] + alloc.sizes[reg.nr]));
@@ -102,7 +129,7 @@ var_from_reg(const simple_allocator &alloc, const dst_reg &reg,
    assert(reg.file == VGRF && reg.nr < alloc.count && c < 4);
    const unsigned csize = DIV_ROUND_UP(type_sz(reg.type), 4);
    unsigned result =
-      8 * (alloc.offsets[reg.nr] + reg.offset / REG_SIZE) +
+      8 * alloc.offsets[reg.nr] + reg.offset / 4 +
       (c + k / csize * 4) * csize + k % csize;
    /* Do not exceed the limit for this register */
    assert(result < 8 * (alloc.offsets[reg.nr] + alloc.sizes[reg.nr]));
@@ -110,3 +137,5 @@ var_from_reg(const simple_allocator &alloc, const dst_reg &reg,
 }
 
 } /* namespace brw */
+
+#endif /* BRW_VEC4_LIVE_VARIABLES_H */