Mercurial > hg > CbC > CbC_gcc
diff gcc/omp-simd-clone.c @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children | 1830386684a0 |
line wrap: on
line diff
--- a/gcc/omp-simd-clone.c Fri Oct 27 22:46:09 2017 +0900 +++ b/gcc/omp-simd-clone.c Thu Oct 25 07:37:49 2018 +0900 @@ -1,6 +1,6 @@ /* OMP constructs' SIMD clone supporting code. -Copyright (C) 2005-2017 Free Software Foundation, Inc. +Copyright (C) 2005-2018 Free Software Foundation, Inc. This file is part of GCC. @@ -45,11 +45,21 @@ #include "tree-dfa.h" #include "cfgloop.h" #include "symbol-summary.h" -#include "ipa-prop.h" +#include "ipa-param-manipulation.h" #include "tree-eh.h" #include "varasm.h" #include "stringpool.h" #include "attribs.h" +#include "omp-simd-clone.h" + +/* Return the number of elements in vector type VECTYPE, which is associated + with a SIMD clone. At present these always have a constant length. */ + +static unsigned HOST_WIDE_INT +simd_clone_subparts (tree vectype) +{ + return TYPE_VECTOR_SUBPARTS (vectype).to_constant (); +} /* Allocate a fresh `simd_clone' and return it. NARGS is the number of arguments to reserve space for. */ @@ -112,19 +122,10 @@ if (n > 0 && args.last () == void_type_node) n--; - /* To distinguish from an OpenMP simd clone, Cilk Plus functions to - be cloned have a distinctive artificial label in addition to "omp - declare simd". */ - bool cilk_clone - = (flag_cilkplus - && lookup_attribute ("cilk simd function", - DECL_ATTRIBUTES (node->decl))); - /* Allocate one more than needed just in case this is an in-branch clone which will require a mask argument. */ struct cgraph_simd_clone *clone_info = simd_clone_struct_alloc (n + 1); clone_info->nargs = n; - clone_info->cilk_elemental = cilk_clone; if (!clauses) goto out; @@ -455,6 +456,8 @@ if (new_node == NULL) return new_node; + DECL_BUILT_IN_CLASS (new_node->decl) = NOT_BUILT_IN; + DECL_FUNCTION_CODE (new_node->decl) = (enum built_in_function) 0; TREE_PUBLIC (new_node->decl) = TREE_PUBLIC (old_node->decl); DECL_COMDAT (new_node->decl) = DECL_COMDAT (old_node->decl); DECL_WEAK (new_node->decl) = DECL_WEAK (old_node->decl); @@ -770,7 +773,7 @@ } continue; } - if (TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg)) == node->simdclone->simdlen) + if (simd_clone_subparts (TREE_TYPE (arg)) == node->simdclone->simdlen) { tree ptype = build_pointer_type (TREE_TYPE (TREE_TYPE (array))); tree ptr = build_fold_addr_expr (array); @@ -781,7 +784,7 @@ } else { - unsigned int simdlen = TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg)); + unsigned int simdlen = simd_clone_subparts (TREE_TYPE (arg)); tree ptype = build_pointer_type (TREE_TYPE (TREE_TYPE (array))); for (k = 0; k < node->simdclone->simdlen; k += simdlen) { @@ -927,8 +930,8 @@ iter, NULL_TREE, NULL_TREE); if (adjustments[j].op == IPA_PARM_OP_NONE - && TYPE_VECTOR_SUBPARTS (vectype) < node->simdclone->simdlen) - j += node->simdclone->simdlen / TYPE_VECTOR_SUBPARTS (vectype) - 1; + && simd_clone_subparts (vectype) < node->simdclone->simdlen) + j += node->simdclone->simdlen / simd_clone_subparts (vectype) - 1; } l = adjustments.length (); @@ -1132,6 +1135,7 @@ { basic_block orig_exit = EDGE_PRED (EXIT_BLOCK_PTR_FOR_FN (cfun), 0)->src; incr_bb = create_empty_bb (orig_exit); + incr_bb->count = profile_count::zero (); add_bb_to_loop (incr_bb, body_bb->loop_father); /* The succ of orig_exit was EXIT_BLOCK_PTR_FOR_FN (cfun), with an empty flag. Set it now to be a FALLTHRU_EDGE. */ @@ -1142,11 +1146,13 @@ { edge e = EDGE_PRED (EXIT_BLOCK_PTR_FOR_FN (cfun), i); redirect_edge_succ (e, incr_bb); + incr_bb->count += e->count (); } } else if (node->simdclone->inbranch) { incr_bb = create_empty_bb (entry_bb); + incr_bb->count = profile_count::zero (); add_bb_to_loop (incr_bb, body_bb->loop_father); } @@ -1243,6 +1249,7 @@ gsi_insert_after (&gsi, g, GSI_CONTINUE_LINKING); edge e = make_edge (loop->header, incr_bb, EDGE_TRUE_VALUE); e->probability = profile_probability::unlikely ().guessed (); + incr_bb->count += e->count (); edge fallthru = FALLTHRU_EDGE (loop->header); fallthru->flags = EDGE_FALSE_VALUE; fallthru->probability = profile_probability::likely ().guessed (); @@ -1385,10 +1392,8 @@ (single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun)), seq); entry_bb = single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)); - int freq = compute_call_stmt_bb_frequency (current_function_decl, - entry_bb); node->create_edge (cgraph_node::get_create (fn), - call, entry_bb->count, freq); + call, entry_bb->count); imm_use_iterator iter; use_operand_p use_p; @@ -1566,7 +1571,7 @@ /* If the function in NODE is tagged as an elemental SIMD function, create the appropriate SIMD clones. */ -static void +void expand_simd_clones (struct cgraph_node *node) { tree attr = lookup_attribute ("omp declare simd",