From: Jürg Billeter Date: Mon, 1 Aug 2011 19:14:34 +0000 (+0200) Subject: codegen: Do not use temp var when accessing single-assignment locals X-Git-Tag: 0.13.2~47 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=aecb457deed3e99ad3a941d247acc0e01aa7be89;p=thirdparty%2Fvala.git codegen: Do not use temp var when accessing single-assignment locals --- diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala index 6abce4872..4e428fbe4 100644 --- a/codegen/valaccodememberaccessmodule.vala +++ b/codegen/valaccodememberaccessmodule.vala @@ -689,7 +689,22 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule { } result.value_type.value_owned = false; - if (!(variable is Parameter && variable.name == "this") && is_lvalue_access_allowed (result.value_type)) { + bool use_temp = true; + if (!is_lvalue_access_allowed (result.value_type)) { + // special handling for types such as va_list + use_temp = false; + } + if (variable is Parameter && variable.name == "this") { + use_temp = false; + } + if (variable.single_assignment && !result.value_type.is_real_struct_type ()) { + // no need to copy values from variables that are exactly once + // as there is no risk of modification + // except for structs that are always passed by reference + use_temp = false; + } + + if (use_temp) { result = (GLibValue) store_temp_value (result, variable); } diff --git a/vala/valaflowanalyzer.vala b/vala/valaflowanalyzer.vala index 87d6728f9..ada3254d3 100644 --- a/vala/valaflowanalyzer.vala +++ b/vala/valaflowanalyzer.vala @@ -514,6 +514,9 @@ public class Vala.FlowAnalyzer : CodeVisitor { if (variable_stack == null) { variable_stack = new ArrayList (); var_map.set (var_symbol, variable_stack); + var_symbol.single_assignment = true; + } else { + var_symbol.single_assignment = false; } Variable versioned_var; if (var_symbol is LocalVariable) { diff --git a/vala/valavariable.vala b/vala/valavariable.vala index 9337751e1..e625e660b 100644 --- a/vala/valavariable.vala +++ b/vala/valavariable.vala @@ -49,6 +49,8 @@ public class Vala.Variable : Symbol { } } + public bool single_assignment { get; set; } + Expression? _initializer; DataType? _variable_type;