diff options
Diffstat (limited to 'gcc/tree-nested.c')
-rw-r--r-- | gcc/tree-nested.c | 51 |
1 files changed, 26 insertions, 25 deletions
diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c index 4f6ec71..45c9bfe 100644 --- a/gcc/tree-nested.c +++ b/gcc/tree-nested.c @@ -950,7 +950,9 @@ convert_local_reference (tree *tp, int *walk_subtrees, void *data) struct walk_stmt_info *wi = data; struct nesting_info *info = wi->info; tree t = *tp, field, x; + bool save_val_only; + *walk_subtrees = 0; switch (TREE_CODE (t)) { case VAR_DECL: @@ -989,34 +991,31 @@ convert_local_reference (tree *tp, int *walk_subtrees, void *data) break; case ADDR_EXPR: - { - bool save_val_only = wi->val_only; - - wi->val_only = false; - wi->is_lhs = false; - wi->changed = false; - walk_tree (&TREE_OPERAND (t, 0), convert_local_reference, wi, NULL); - wi->val_only = save_val_only; + save_val_only = wi->val_only; + wi->val_only = false; + wi->is_lhs = false; + wi->changed = false; + walk_tree (&TREE_OPERAND (t, 0), convert_local_reference, wi, NULL); + wi->val_only = save_val_only; - /* If we converted anything ... */ - if (wi->changed) - { - tree save_context; + /* If we converted anything ... */ + if (wi->changed) + { + tree save_context; - /* Then the frame decl is now addressable. */ - TREE_ADDRESSABLE (info->frame_decl) = 1; + /* Then the frame decl is now addressable. */ + TREE_ADDRESSABLE (info->frame_decl) = 1; - save_context = current_function_decl; - current_function_decl = info->context; - recompute_tree_invarant_for_addr_expr (t); - current_function_decl = save_context; - - /* If we are in a context where we only accept values, then - compute the address into a temporary. */ - if (save_val_only) - *tp = tsi_gimplify_val (wi->info, t, &wi->tsi); - } - } + save_context = current_function_decl; + current_function_decl = info->context; + recompute_tree_invarant_for_addr_expr (t); + current_function_decl = save_context; + + /* If we are in a context where we only accept values, then + compute the address into a temporary. */ + if (save_val_only) + *tp = tsi_gimplify_val (wi->info, t, &wi->tsi); + } break; case REALPART_EXPR: @@ -1028,6 +1027,7 @@ convert_local_reference (tree *tp, int *walk_subtrees, void *data) /* Go down this entire nest and just look at the final prefix and anything that describes the references. Otherwise, we lose track of whether a NOP_EXPR or VIEW_CONVERT_EXPR needs a simple value. */ + save_val_only = wi->val_only; wi->val_only = true; wi->is_lhs = false; for (; handled_component_p (t); tp = &TREE_OPERAND (t, 0), t = *tp) @@ -1055,6 +1055,7 @@ convert_local_reference (tree *tp, int *walk_subtrees, void *data) } wi->val_only = false; walk_tree (tp, convert_local_reference, wi, NULL); + wi->val_only = save_val_only; break; default: |