diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-03-24 11:23:29 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-03-24 11:23:29 +0000 |
commit | 1d0b727d82c306aeef33ed287bec5aa9594bc4b0 (patch) | |
tree | df3f9f4a9233142004cc074157b5b3c2abf3bcb5 /gcc/ipa-split.c | |
parent | 9339c78bc6a05194d53a5a19ae3eb0eb58e6324a (diff) | |
download | gcc-1d0b727d82c306aeef33ed287bec5aa9594bc4b0.tar.gz |
2011-03-24 Richard Guenther <rguenther@suse.de>
PR tree-optimization/46562
* tree.c (build_invariant_address): New function.
* tree.h (build_invariant_address): Declare.
* tree-dfa.c (get_addr_base_and_unit_offset): Wrap around
a renamed function moved ...
* tree-flow-inline.h (get_addr_base_and_unit_offset_1): ... here.
Take valueization callback parameter.
* tree-flow.h (gimple_fold_stmt_to_constant): Declare.
* gimple-fold.h: New file.
* tree-ssa-ccp.c (ccp_fold): Use gimple_fold_stmt_to_constant_1.
(ccp_fold, fold_const_aggregate_ref,
fold_ctor_reference, fold_nonarray_ctor_reference,
fold_array_ctor_reference, fold_string_cst_ctor_reference,
get_base_constructor): Move ...
* gimple-fold.c: ... here.
(gimple_fold_stmt_to_constant_1): New function
split out from ccp_fold. Take a valueization callback parameter.
Valueize all operands.
(gimple_fold_stmt_to_constant): New wrapper function.
(fold_const_aggregate_ref_1): New function split out from
fold_const_aggregate_ref. Take a valueization callback parameter.
(fold_const_aggregate_ref): Wrap fold_const_aggregate_ref_1.
* tree-ssa-sccvn.c (simplify_binary_expression): Simplify
invariant POINTER_PLUS_EXPRs to invariant form.
(vn_valueize): New function.
(try_to_simplify): Simplify by using gimple_fold_stmt_to_constant.
* tree-vrp.c (vrp_valueize): New function.
(vrp_visit_assignment_or_call): Use gimple_fold_stmt_to_constant
to fold statements to constants.
* tree-ssa-pre.c (eliminate): Properly guard propagation of
function declarations.
* Makefile.in (tree-ssa-sccvn.o, tree-vrp.o, gimple-fold.o,
tree-ssa-ccp.o): Add gimple-fold.h dependencies.
* c-c++-common/pr46562-2.c: New testcase.
* c-c++-common/pr46562.c: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@171386 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ipa-split.c')
-rw-r--r-- | gcc/ipa-split.c | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c index 3b26f61b1fb..1dde723e3da 100644 --- a/gcc/ipa-split.c +++ b/gcc/ipa-split.c @@ -169,8 +169,9 @@ static void dump_split_point (FILE * file, struct split_point *current) { fprintf (file, - "Split point at BB %i header time:%i header size: %i" - " split time: %i split size: %i\n bbs: ", + "Split point at BB %i\n" + " header time: %i header size: %i\n" + " split time: %i split size: %i\n bbs: ", current->entry_bb->index, current->header_time, current->header_size, current->split_time, current->split_size); dump_bitmap (file, current->split_bbs); @@ -1036,12 +1037,13 @@ split_function (struct split_point *split_point) /* If RETURN_BB has virtual operand PHIs, they must be removed and the virtual operand marked for renaming as we change the CFG in a way that - tree-inline is not able to compensate for. + tree-inline is not able to compensate for. Note this can happen whether or not we have a return value. If we have a return value, then RETURN_BB may have PHIs for real operands too. */ if (return_bb != EXIT_BLOCK_PTR) { + bool phi_p = false; for (gsi = gsi_start_phis (return_bb); !gsi_end_p (gsi);) { gimple stmt = gsi_stmt (gsi); @@ -1052,7 +1054,28 @@ split_function (struct split_point *split_point) } mark_virtual_phi_result_for_renaming (stmt); remove_phi_node (&gsi, true); + phi_p = true; } + /* In reality we have to rename the reaching definition of the + virtual operand at return_bb as we will eventually release it + when we remove the code region we outlined. + So we have to rename all immediate virtual uses of that region + if we didn't see a PHI definition yet. */ + /* ??? In real reality we want to set the reaching vdef of the + entry of the SESE region as the vuse of the call and the reaching + vdef of the exit of the SESE region as the vdef of the call. */ + if (!phi_p) + for (gsi = gsi_start_bb (return_bb); !gsi_end_p (gsi); gsi_next (&gsi)) + { + gimple stmt = gsi_stmt (gsi); + if (gimple_vuse (stmt)) + { + gimple_set_vuse (stmt, NULL_TREE); + update_stmt (stmt); + } + if (gimple_vdef (stmt)) + break; + } } /* Now create the actual clone. */ |