Mercurial > hg > CbC > CbC_gcc
diff gcc/tree-outof-ssa.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/tree-outof-ssa.c Fri Oct 27 22:46:09 2017 +0900 +++ b/gcc/tree-outof-ssa.c Thu Oct 25 07:37:49 2018 +0900 @@ -1,5 +1,5 @@ /* Convert a program in SSA form into Normal form. - Copyright (C) 2004-2017 Free Software Foundation, Inc. + Copyright (C) 2004-2018 Free Software Foundation, Inc. Contributed by Andrew Macleod <amacleod@redhat.com> This file is part of GCC. @@ -27,10 +27,12 @@ #include "gimple.h" #include "cfghooks.h" #include "ssa.h" +#include "tree-ssa.h" #include "memmodel.h" #include "emit-rtl.h" #include "gimple-pretty-print.h" #include "diagnostic-core.h" +#include "tree-dfa.h" #include "stor-layout.h" #include "cfgrtl.h" #include "cfganal.h" @@ -63,7 +65,7 @@ return false; /* If the statement may throw an exception, it cannot be replaced. */ - if (stmt_could_throw_p (stmt)) + if (stmt_could_throw_p (cfun, stmt)) return false; /* Punt if there is more than 1 def. */ @@ -888,6 +890,102 @@ } } +/* Create a default def for VAR. */ + +static void +create_default_def (tree var, void *arg ATTRIBUTE_UNUSED) +{ + if (!is_gimple_reg (var)) + return; + + tree ssa = get_or_create_ssa_default_def (cfun, var); + gcc_assert (ssa); +} + +/* Call CALLBACK for all PARM_DECLs and RESULT_DECLs for which + assign_parms may ask for a default partition. */ + +static void +for_all_parms (void (*callback)(tree var, void *arg), void *arg) +{ + for (tree var = DECL_ARGUMENTS (current_function_decl); var; + var = DECL_CHAIN (var)) + callback (var, arg); + if (!VOID_TYPE_P (TREE_TYPE (DECL_RESULT (current_function_decl)))) + callback (DECL_RESULT (current_function_decl), arg); + if (cfun->static_chain_decl) + callback (cfun->static_chain_decl, arg); +} + +/* We need to pass two arguments to set_parm_default_def_partition, + but for_all_parms only supports one. Use a pair. */ + +typedef std::pair<var_map, bitmap> parm_default_def_partition_arg; + +/* Set in ARG's PARTS bitmap the bit corresponding to the partition in + ARG's MAP containing VAR's default def. */ + +static void +set_parm_default_def_partition (tree var, void *arg_) +{ + parm_default_def_partition_arg *arg = (parm_default_def_partition_arg *)arg_; + var_map map = arg->first; + bitmap parts = arg->second; + + if (!is_gimple_reg (var)) + return; + + tree ssa = ssa_default_def (cfun, var); + gcc_assert (ssa); + + int version = var_to_partition (map, ssa); + gcc_assert (version != NO_PARTITION); + + bool changed = bitmap_set_bit (parts, version); + gcc_assert (changed); +} + +/* Allocate and return a bitmap that has a bit set for each partition + that contains a default def for a parameter. */ + +static bitmap +get_parm_default_def_partitions (var_map map) +{ + bitmap parm_default_def_parts = BITMAP_ALLOC (NULL); + + parm_default_def_partition_arg + arg = std::make_pair (map, parm_default_def_parts); + + for_all_parms (set_parm_default_def_partition, &arg); + + return parm_default_def_parts; +} + +/* Allocate and return a bitmap that has a bit set for each partition + that contains an undefined value. */ + +static bitmap +get_undefined_value_partitions (var_map map) +{ + bitmap undefined_value_parts = BITMAP_ALLOC (NULL); + + for (unsigned int i = 1; i < num_ssa_names; i++) + { + tree var = ssa_name (i); + if (var + && !virtual_operand_p (var) + && !has_zero_uses (var) + && ssa_undefined_value_p (var)) + { + const int p = var_to_partition (map, var); + if (p != NO_PARTITION) + bitmap_set_bit (undefined_value_parts, p); + } + } + + return undefined_value_parts; +} + /* Given the out-of-ssa info object SA (with prepared partitions) eliminate all phi nodes in all basic blocks. Afterwards no basic block will have phi nodes anymore and there are possibly @@ -945,7 +1043,9 @@ bitmap values = NULL; var_map map; - map = coalesce_ssa_name (); + for_all_parms (create_default_def, NULL); + map = init_var_map (num_ssa_names); + coalesce_ssa_name (map); /* Return to viewing the variable list as just all reference variables after coalescing has been performed. */