diff options
Diffstat (limited to 'gcc/ipa-reference.c')
-rw-r--r-- | gcc/ipa-reference.c | 64 |
1 files changed, 41 insertions, 23 deletions
diff --git a/gcc/ipa-reference.c b/gcc/ipa-reference.c index a9afd457a73..4bc49cf0a05 100644 --- a/gcc/ipa-reference.c +++ b/gcc/ipa-reference.c @@ -433,33 +433,51 @@ scan_stmt_for_static_refs (gimple_stmt_iterator *gsip, if (fn) local = get_reference_vars_info (fn)->local; - if (gimple_loaded_syms (stmt)) - EXECUTE_IF_SET_IN_BITMAP (gimple_loaded_syms (stmt), 0, i, bi) - mark_load (local, referenced_var_lookup (i)); - if (gimple_stored_syms (stmt)) - EXECUTE_IF_SET_IN_BITMAP (gimple_stored_syms (stmt), 0, i, bi) - mark_store (local, referenced_var_lookup (i)); - if (gimple_addresses_taken (stmt)) - EXECUTE_IF_SET_IN_BITMAP (gimple_addresses_taken (stmt), 0, i, bi) - mark_address_taken (referenced_var_lookup (i)); - - switch (gimple_code (stmt)) + /* Look for direct loads and stores. */ + if (gimple_has_lhs (stmt)) + { + tree lhs = get_base_address (gimple_get_lhs (stmt)); + if (lhs && DECL_P (lhs)) + mark_store (local, lhs); + } + if (gimple_assign_single_p (stmt)) { - case GIMPLE_CALL: + tree rhs = get_base_address (gimple_assign_rhs1 (stmt)); + if (rhs && DECL_P (rhs)) + mark_load (local, rhs); + } + else if (is_gimple_call (stmt)) + { + for (i = 0; i < gimple_call_num_args (stmt); ++i) + { + tree rhs = get_base_address (gimple_call_arg (stmt, i)); + if (rhs && DECL_P (rhs)) + mark_load (local, rhs); + } check_call (local, stmt); - break; - - case GIMPLE_ASM: + } + else if (gimple_code (stmt) == GIMPLE_ASM) + { + for (i = 0; i < gimple_asm_ninputs (stmt); ++i) + { + tree op = TREE_VALUE (gimple_asm_input_op (stmt, i)); + op = get_base_address (op); + if (op && DECL_P (op)) + mark_load (local, op); + } + for (i = 0; i < gimple_asm_noutputs (stmt); ++i) + { + tree op = TREE_VALUE (gimple_asm_output_op (stmt, i)); + op = get_base_address (op); + if (op && DECL_P (op)) + mark_store (local, op); + } check_asm_memory_clobber (local, stmt); - break; - - /* We used to check nonlocal labels here and set them as potentially modifying - everything. This is not needed, since we can get to nonlocal label only - from callee and thus we will get info propagated. */ - - default: - break; } + + if (gimple_addresses_taken (stmt)) + EXECUTE_IF_SET_IN_BITMAP (gimple_addresses_taken (stmt), 0, i, bi) + mark_address_taken (referenced_var_lookup (i)); return NULL; } |