glsl: use a non-malloc'd storage for short ir_variable names
authorMarek Olšák <marek.olsak@amd.com>
Fri, 7 Oct 2016 20:26:58 +0000 (22:26 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 31 Oct 2016 10:53:38 +0000 (11:53 +0100)
Tested-by: Edmondo Tommasina <edmondo.tommasina@gmail.com>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/compiler/glsl/ir.cpp
src/compiler/glsl/ir.h
src/compiler/glsl/lower_packed_varyings.cpp

index c5943e5fcaac65f97613ecf40dba9e680cb7bceb..8e4b382ebd3c65bbfcc1ff3ef6744dd997a6e901 100644 (file)
@@ -1523,6 +1523,10 @@ ir_variable::ir_variable(const struct glsl_type *type, const char *name,
    if (mode == ir_var_temporary
        && (name == NULL || name == ir_variable::tmp_name)) {
       this->name = ir_variable::tmp_name;
+   } else if (name == NULL ||
+              strlen(name) < ARRAY_SIZE(this->name_storage)) {
+      strcpy(this->name_storage, name ? name : "");
+      this->name = this->name_storage;
    } else {
       this->name = ralloc_strdup(this, name);
    }
index f07e3b20910d4f51c99e5ca80aca38a760142dfd..433ba1938018733a2331224499c9cc965489fe0a 100644 (file)
@@ -599,7 +599,8 @@ public:
 
    inline bool is_name_ralloced() const
    {
-      return this->name != ir_variable::tmp_name;
+      return this->name != ir_variable::tmp_name &&
+             this->name != this->name_storage;
    }
 
    /**
@@ -624,6 +625,16 @@ public:
     */
    const char *name;
 
+private:
+   /**
+    * If the name length fits into name_storage, it's used, otherwise
+    * the name is ralloc'd. shader-db mining showed that 70% of variables
+    * fit here. This is a win over ralloc where only ralloc_header has
+    * 20 bytes on 64-bit (28 bytes with DEBUG), and we can also skip malloc.
+    */
+   char name_storage[16];
+
+public:
    struct ir_variable_data {
 
       /**
index 1e8cf113273a261738bab15b77efe968a2734cb2..19bbe576a695dd79db32762affacdfd4a50aea24 100644 (file)
@@ -639,8 +639,12 @@ lower_packed_varyings_visitor::get_packed_varying_deref(
        * first time we visit each component.
        */
       if (this->gs_input_vertices == 0 || vertex_index == 0) {
-         ralloc_asprintf_append((char **) &this->packed_varyings[slot]->name,
-                                ",%s", name);
+         ir_variable *var = this->packed_varyings[slot];
+
+         if (var->is_name_ralloced())
+            ralloc_asprintf_append((char **) &var->name, ",%s", name);
+         else
+            var->name = ralloc_asprintf(var, "%s,%s", var->name, name);
       }
    }