From: Ian Romanick <ian.d.roman...@intel.com> Most of the overhead of the name allocation is the ralloc tracking, especially on 64-bit. The allocation of the variable name "i" is 2 bytes for the name and 40 bytes for the ralloc tracking.
I collected data from shader-db. At the end of link_shaders I added a visitor to print the name of every ir_variable in every shader. Out of the 188,786 names logged, 47,636 were two characters or less (the size that will fit in the padding on 32-bit builds) and 89,610 were six characters or less (the size that will fit in the padding on 64-bit builds). Valgrind massif results for a trimmed apitrace of dota2: n time(i) total(B) useful-heap(B) extra-heap(B) stacks(B) Before (32-bit): 56 40,527,975,617 66,347,992 61,187,818 5,160,174 0 After (32-bit): 52 40,521,071,734 66,157,928 61,054,870 5,103,058 0 Before (64-bit): 62 37,089,989,777 93,205,752 85,900,367 7,305,385 0 After (64-bit): 48 37,089,379,412 92,630,712 85,454,539 7,176,173 0 A real savings of 129KiB on 32-bit and 435KiB on 64-bit. The savings is much higher on 64-bit because ir_instruction::padding is 7 bytes (instead of 3 bytes on 32-bit). This allows a lot more names to fit in the padding. Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> --- src/glsl/ir.cpp | 5 +++++ src/glsl/ir.h | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp index bc008a4..4b22439 100644 --- a/src/glsl/ir.cpp +++ b/src/glsl/ir.cpp @@ -1559,6 +1559,11 @@ 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) { + this->padding[0] = 0; + this->name = (char *) this->padding; + } else if (strlen(name) < sizeof(this->padding)) { + this->name = strcpy((char *) this->padding, name); } else { this->name = ralloc_strdup(this, name); } diff --git a/src/glsl/ir.h b/src/glsl/ir.h index ead0863..770fe60 100644 --- a/src/glsl/ir.h +++ b/src/glsl/ir.h @@ -598,7 +598,8 @@ public: inline bool is_name_ralloced() const { - return this->name != ir_variable::tmp_name; + return this->name != ir_variable::tmp_name + && this->name != (char *) this->padding; } /** -- 1.8.1.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev