On Wed, Nov 11, 2020 at 03:14:59AM -0800, Erick Ochoa wrote:
> 
> Using the Dead Field Analysis, Dead Field Elimination
> automatically transforms gimple to eliminate fields that
> are never read.
> 
> 2020-11-04  Erick Ochoa  <erick.oc...@theobroma-systems.com>
> 
>     * gcc/Makefile.in: add file to list of sources
>     * gcc/ipa-dfe.c: New
>     * gcc/ipa-dfe.h: Same
>     * gcc/ipa-type-escape-analysis.h: Export code used in dfe.
>     * gcc/ipa-type-escape-analysis.c: Call transformation

Just random general nits, not a review.
The gcc/ prefix shouldn't be in the filenames, paths are relative
to the ChangeLog file into which it goes and gcc/ directory has a ChangeLog.
All entries should start with a capital letter, so Add above, and all should
end with a period (missing in all but one place).

> ---
>  gcc/Makefile.in                |    1 +
>  gcc/ipa-dfe.c                  | 1284 ++++++++++++++++++++++++++++++++
>  gcc/ipa-dfe.h                  |  247 ++++++
>  gcc/ipa-type-escape-analysis.c |   22 +-
>  gcc/ipa-type-escape-analysis.h |   10 +
>  5 files changed, 1554 insertions(+), 10 deletions(-)
>  create mode 100644 gcc/ipa-dfe.c
>  create mode 100644 gcc/ipa-dfe.h
> 
> diff --git a/gcc/Makefile.in b/gcc/Makefile.in
> index 8b18c9217a2..8ef6047870b 100644
> --- a/gcc/Makefile.in
> +++ b/gcc/Makefile.in
> @@ -1416,6 +1416,7 @@ OBJS = \
>       init-regs.o \
>       internal-fn.o \
>       ipa-type-escape-analysis.o \
> +     ipa-dfe.o \
>       ipa-cp.o \
>       ipa-sra.o \
>       ipa-devirt.o \
> diff --git a/gcc/ipa-dfe.c b/gcc/ipa-dfe.c
> new file mode 100644
> index 00000000000..5ba68332ad2
> --- /dev/null
> +++ b/gcc/ipa-dfe.c
> @@ -0,0 +1,1284 @@
> +/* IPA Type Escape Analysis and Dead Field Elimination
> +   Copyright (C) 2019-2020 Free Software Foundation, Inc.
> +
> +  Contributed by Erick Ochoa <erick.oc...@theobroma-systems.com>
> +
> +This file is part of GCC.
> +
> +GCC is free software; you can redistribute it and/or modify it under
> +the terms of the GNU General Public License as published by the Free
> +Software Foundation; either version 3, or (at your option) any later
> +version.
> +
> +GCC is distributed in the hope that it will be useful, but WITHOUT ANY
> +WARRANTY; without even the implied warranty of MERCHANTABILITY or
> +FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
> +for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with GCC; see the file COPYING3.  If not see
> +<http://www.gnu.org/licenses/>.  */
> +
> +/* Interprocedural dead field elimination (IPA-DFE)
> +
> +   The goal of this transformation is to
> +
> +   1) Create new types to replace RECORD_TYPEs which hold dead fields.
> +   2) Substitute instances of old RECORD_TYPEs for new RECORD_TYPEs.
> +   3) Substitute instances of old FIELD_DECLs for new FIELD_DECLs.
> +   4) Fix some instances of pointer arithmetic.
> +   5) Relayout where needed.
> +
> +   First stage - DFA
> +   =================
> +
> +   Use DFA to compute the set of FIELD_DECLs which can be deleted.
> +
> +   Second stage - Reconstruct Types
> +   ================================
> +
> +   This stage is done by two family of classes, the SpecificTypeCollector
> +   and the TypeReconstructor.
> +
> +   The SpecificTypeCollector collects all TYPE_P trees which point to
> +   RECORD_TYPE trees returned by DFA.  The TypeReconstructor will create
> +   new RECORD_TYPE trees and new TYPE_P trees replacing the old RECORD_TYPE
> +   trees with the new RECORD_TYPE trees.
> +
> +   Third stage - Substitute Types and Relayout
> +   ===========================================
> +
> +   This stage is handled by ExprRewriter and GimpleRewriter.
> +   Some pointer arithmetic is fixed here to take into account those
> eliminated
> +   FIELD_DECLS.
> + */
> +
> +#include "config.h"
> +
> +#include <map>
> +#include <set>
> +#include <vector>
> +#include <stack>
> +#include <string>

We really do not want to use STL in GCC sources that much, we have our own
vectors and hash_sets/maps.  If something is still needed after that,
the standard way to include STL header is define INCLUDE_ALGORITHM etc.
macros before including system.h.
> +
> +#include "system.h"

> +  TypeStringifier stringifier;

GCC is not a CamelCase shop, so types etc. should use lower-case
only and underscores instead.  This is everywhere in the patch.
> +
> +  // Here we are just placing the types of interest in a set.
> +  for (std::map<tree, field_offsets_t>::const_iterator i
> +       = record_field_offset_map.begin (),
> +       e = record_field_offset_map.end ();
> +       i != e; ++i)

This should just use hash_map.

> +  for (std::set<tree>::const_iterator i = non_escaping.begin (),
> +                                         e = non_escaping.end ();
> +       i != e; ++i)
> +    {
> +      tree type = *i;
> +      specifier.walk (type);
> +    }
> +
> +  // These are all the types which need modifications.
> +  std::set<tree> to_modify = specifier.get_set ();

And hash_set.

Also note that code-generation from hash table iterations should be
generally avoided, because the exact iteration order can change between
different runs (or e.g. between cross-compilers from different hosts etc.).
> +      tree o_record = i->first;
> +      std::string o_name = stringifier.stringify (o_record);
> +      log ("original: %s\n", o_name.c_str ());
> +      tree r_record = i->second;
> +      std::string r_name
> +     = r_record ? stringifier.stringify (r_record) : std::string ("");
> +      log ("modified: %s\n", r_name.c_str ());

This should use the various diagnostic routines rather than std::string etc.

> +static tree
> +get_new_identifier (tree type)
> +{
> +  const char *identifier = TypeStringifier::get_type_identifier
> (type).c_str ();
> +  const bool is_new_type = strstr (identifier, "reorg");

reorg substring can appear in any user type name, can't it?

        Jakub

Reply via email to