From 94ec37a909697bbf29db73278c77621ccdf60693 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Fri, 8 Mar 2019 10:20:12 +0000 Subject: [PATCH] re PR target/89578 (5% runtime regression for 481.wrf at -Ofast -flto) 2019-03-08 Richard Biener 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 --- gcc/ChangeLog | 11 +++++++++++ gcc/cfgloop.h | 4 ++++ gcc/cfgloopmanip.c | 1 + gcc/lto-streamer-in.c | 1 + gcc/lto-streamer-out.c | 1 + gcc/tree-cfg.c | 3 ++- gcc/tree-inline.c | 5 +++++ 7 files changed, 25 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 72a1c3f26fe..b46c5aff266 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2019-03-08 Richard Biener + + 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 PR target/80190 diff --git a/gcc/cfgloop.h b/gcc/cfgloop.h index 2e93af39a1a..e82cd7a034a 100644 --- a/gcc/cfgloop.h +++ b/gcc/cfgloop.h @@ -227,6 +227,10 @@ struct GTY ((chain_next ("%h.next"))) loop { Other values means unroll with the given unrolling factor. */ 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 by IFN_GOMP_SIMD_VF, IFN_GOMP_SIMD_LANE and IFN_GOMP_SIMD_LAST_LANE builtins. */ diff --git a/gcc/cfgloopmanip.c b/gcc/cfgloopmanip.c index 7eb587aaf61..bfee48ed8cc 100644 --- a/gcc/cfgloopmanip.c +++ b/gcc/cfgloopmanip.c @@ -1024,6 +1024,7 @@ copy_loop_info (struct loop *loop, struct loop *target) target->force_vectorize = loop->force_vectorize; target->in_oacc_kernels_region = loop->in_oacc_kernels_region; target->unroll = loop->unroll; + target->owned_clique = loop->owned_clique; } /* Copies copy of LOOP as subloop of TARGET loop, placing newly diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c index 6d78e66bc31..7727b9be760 100644 --- a/gcc/lto-streamer-in.c +++ b/gcc/lto-streamer-in.c @@ -826,6 +826,7 @@ input_cfg (struct lto_input_block *ib, struct data_in *data_in, /* Read OMP SIMD related info. */ loop->safelen = 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->force_vectorize = streamer_read_hwi (ib); loop->simduid = stream_read_tree (ib, data_in); diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c index a72016a4843..b6e395b53fd 100644 --- a/gcc/lto-streamer-out.c +++ b/gcc/lto-streamer-out.c @@ -1938,6 +1938,7 @@ output_cfg (struct output_block *ob, struct function *fn) /* Write OMP SIMD related info. */ streamer_write_hwi (ob, loop->safelen); 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->force_vectorize); stream_write_tree (ob, loop->simduid, true); diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 088fc7b47df..f433efc89c0 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -6244,7 +6244,8 @@ gimple_duplicate_bb (basic_block bb, copy_bb_data *id) op = TREE_OPERAND (op, 0); if ((TREE_CODE (op) == 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) id->dependence_map = new hash_maphas_unroll = true; if (dest_loop->force_vectorize) 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. */ place_new_loop (cfun, dest_loop); -- 2.30.2