diff options
Diffstat (limited to 'gcc/gimple.h')
-rw-r--r-- | gcc/gimple.h | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/gcc/gimple.h b/gcc/gimple.h index ffc3441..7d2289b 100644 --- a/gcc/gimple.h +++ b/gcc/gimple.h @@ -933,6 +933,8 @@ extern bool is_gimple_ip_invariant (const_tree); extern bool is_gimple_val (tree); /* Returns true iff T is a GIMPLE asm statement input. */ extern bool is_gimple_asm_val (tree); +/* Returns true iff T is a valid address operand of a MEM_REF. */ +bool is_gimple_mem_ref_addr (tree); /* Returns true iff T is a valid rhs for a MODIFY_EXPR where the LHS is a GIMPLE temporary, a renamed user variable, or something else, respectively. */ @@ -2037,7 +2039,18 @@ gimple_call_fndecl (const_gimple gs) { tree addr = gimple_call_fn (gs); if (TREE_CODE (addr) == ADDR_EXPR) - return TREE_OPERAND (addr, 0); + { + tree fndecl = TREE_OPERAND (addr, 0); + if (TREE_CODE (fndecl) == MEM_REF) + { + if (TREE_CODE (TREE_OPERAND (fndecl, 0)) == ADDR_EXPR + && integer_zerop (TREE_OPERAND (fndecl, 1))) + return TREE_OPERAND (TREE_OPERAND (fndecl, 0), 0); + else + return NULL_TREE; + } + return TREE_OPERAND (addr, 0); + } return NULL_TREE; } @@ -4857,8 +4870,8 @@ void gimplify_and_update_call_from_tree (gimple_stmt_iterator *, tree); tree gimple_fold_builtin (gimple); bool fold_stmt (gimple_stmt_iterator *); bool fold_stmt_inplace (gimple); -tree maybe_fold_offset_to_reference (location_t, tree, tree, tree); tree maybe_fold_offset_to_address (location_t, tree, tree, tree); +tree maybe_fold_offset_to_reference (location_t, tree, tree, tree); tree maybe_fold_stmt_addition (location_t, tree, tree, tree); tree get_symbol_constant_value (tree); bool may_propagate_address_into_dereference (tree, tree); |