Commit 94ec37a9 by Richard Biener Committed by Richard Biener

re PR target/89578 (5% runtime regression for 481.wrf at -Ofast -flto)

2019-03-08  Richard Biener  <rguenther@suse.de>

	PR middle-end/89578
	* cfgloop.h (struct loop): Add owned_clique field.
	* cfgloopmanip.c (copy_loop_info): Copy it.
	* tree-cfg.c (gimple_duplicate_bb): Do not remap owned_clique
	cliques.
	* tree-inline.c (copy_loops): Remap owned_clique.
	* lto-streamer-in.c (input_cfg): Stream owned_clique.
	* lto-streamer-out.c (output_cfg): Likewise.

From-SVN: r269484
parent 5d1504d4
2019-03-08 Richard Biener <rguenther@suse.de>
PR middle-end/89578
* cfgloop.h (struct loop): Add owned_clique field.
* cfgloopmanip.c (copy_loop_info): Copy it.
* tree-cfg.c (gimple_duplicate_bb): Do not remap owned_clique
cliques.
* tree-inline.c (copy_loops): Remap owned_clique.
* lto-streamer-in.c (input_cfg): Stream owned_clique.
* lto-streamer-out.c (output_cfg): Likewise.
2019-03-08 Jakub Jelinek <jakub@redhat.com> 2019-03-08 Jakub Jelinek <jakub@redhat.com>
PR target/80190 PR target/80190
......
...@@ -227,6 +227,10 @@ struct GTY ((chain_next ("%h.next"))) loop { ...@@ -227,6 +227,10 @@ struct GTY ((chain_next ("%h.next"))) loop {
Other values means unroll with the given unrolling factor. */ Other values means unroll with the given unrolling factor. */
unsigned short unroll; unsigned short unroll;
/* If this loop was inlined the main clique of the callee which does
not need remapping when copying the loop body. */
unsigned short owned_clique;
/* For SIMD loops, this is a unique identifier of the loop, referenced /* For SIMD loops, this is a unique identifier of the loop, referenced
by IFN_GOMP_SIMD_VF, IFN_GOMP_SIMD_LANE and IFN_GOMP_SIMD_LAST_LANE by IFN_GOMP_SIMD_VF, IFN_GOMP_SIMD_LANE and IFN_GOMP_SIMD_LAST_LANE
builtins. */ builtins. */
......
...@@ -1024,6 +1024,7 @@ copy_loop_info (struct loop *loop, struct loop *target) ...@@ -1024,6 +1024,7 @@ copy_loop_info (struct loop *loop, struct loop *target)
target->force_vectorize = loop->force_vectorize; target->force_vectorize = loop->force_vectorize;
target->in_oacc_kernels_region = loop->in_oacc_kernels_region; target->in_oacc_kernels_region = loop->in_oacc_kernels_region;
target->unroll = loop->unroll; target->unroll = loop->unroll;
target->owned_clique = loop->owned_clique;
} }
/* Copies copy of LOOP as subloop of TARGET loop, placing newly /* Copies copy of LOOP as subloop of TARGET loop, placing newly
......
...@@ -826,6 +826,7 @@ input_cfg (struct lto_input_block *ib, struct data_in *data_in, ...@@ -826,6 +826,7 @@ input_cfg (struct lto_input_block *ib, struct data_in *data_in,
/* Read OMP SIMD related info. */ /* Read OMP SIMD related info. */
loop->safelen = streamer_read_hwi (ib); loop->safelen = streamer_read_hwi (ib);
loop->unroll = streamer_read_hwi (ib); loop->unroll = streamer_read_hwi (ib);
loop->owned_clique = streamer_read_hwi (ib);
loop->dont_vectorize = streamer_read_hwi (ib); loop->dont_vectorize = streamer_read_hwi (ib);
loop->force_vectorize = streamer_read_hwi (ib); loop->force_vectorize = streamer_read_hwi (ib);
loop->simduid = stream_read_tree (ib, data_in); loop->simduid = stream_read_tree (ib, data_in);
......
...@@ -1938,6 +1938,7 @@ output_cfg (struct output_block *ob, struct function *fn) ...@@ -1938,6 +1938,7 @@ output_cfg (struct output_block *ob, struct function *fn)
/* Write OMP SIMD related info. */ /* Write OMP SIMD related info. */
streamer_write_hwi (ob, loop->safelen); streamer_write_hwi (ob, loop->safelen);
streamer_write_hwi (ob, loop->unroll); streamer_write_hwi (ob, loop->unroll);
streamer_write_hwi (ob, loop->owned_clique);
streamer_write_hwi (ob, loop->dont_vectorize); streamer_write_hwi (ob, loop->dont_vectorize);
streamer_write_hwi (ob, loop->force_vectorize); streamer_write_hwi (ob, loop->force_vectorize);
stream_write_tree (ob, loop->simduid, true); stream_write_tree (ob, loop->simduid, true);
......
...@@ -6244,7 +6244,8 @@ gimple_duplicate_bb (basic_block bb, copy_bb_data *id) ...@@ -6244,7 +6244,8 @@ gimple_duplicate_bb (basic_block bb, copy_bb_data *id)
op = TREE_OPERAND (op, 0); op = TREE_OPERAND (op, 0);
if ((TREE_CODE (op) == MEM_REF if ((TREE_CODE (op) == MEM_REF
|| TREE_CODE (op) == TARGET_MEM_REF) || TREE_CODE (op) == TARGET_MEM_REF)
&& MR_DEPENDENCE_CLIQUE (op) > 1) && MR_DEPENDENCE_CLIQUE (op) > 1
&& MR_DEPENDENCE_CLIQUE (op) != bb->loop_father->owned_clique)
{ {
if (!id->dependence_map) if (!id->dependence_map)
id->dependence_map = new hash_map<dependence_hash, id->dependence_map = new hash_map<dependence_hash,
......
...@@ -2670,6 +2670,11 @@ copy_loops (copy_body_data *id, ...@@ -2670,6 +2670,11 @@ copy_loops (copy_body_data *id,
cfun->has_unroll = true; cfun->has_unroll = true;
if (dest_loop->force_vectorize) if (dest_loop->force_vectorize)
cfun->has_force_vectorize_loops = true; cfun->has_force_vectorize_loops = true;
if (id->src_cfun->last_clique != 0)
dest_loop->owned_clique
= remap_dependence_clique (id,
src_loop->owned_clique
? src_loop->owned_clique : 1);
/* Finally place it into the loop array and the loop tree. */ /* Finally place it into the loop array and the loop tree. */
place_new_loop (cfun, dest_loop); place_new_loop (cfun, dest_loop);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment