This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [patch, fortran] use vec<> in frontend-passes.c
- From: Trevor Saunders <tsaunders at mozilla dot com>
- To: Thomas Koenig <tkoenig at netcologne dot de>
- Cc: "fortran at gcc dot gnu dot org" <fortran at gcc dot gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Sat, 23 Aug 2014 23:02:09 -0400
- Subject: Re: [patch, fortran] use vec<> in frontend-passes.c
- Authentication-results: sourceware.org; auth=none
- References: <53F919F5 dot 2050602 at netcologne dot de>
On Sun, Aug 24, 2014 at 12:47:17AM +0200, Thomas Koenig wrote:
> Hello world,
>
> the attached patch uses the vec<> templates instead of the
> home-grown memory management.
>
> Did I get the style right? I was a bit confused because, with
> the declarations used in the patch, using the vec_safe_truncate
> function failed with a failure to find the right template.
> I'm not an experienced C++ programmer, so I would appreciate a quick
> look at what I did.
>
> Regression-tested. No test case because there is no new
> functionality.
>
> OK for trunk? Any other comments?
>
> Thomas
>
> 2014-08-24 Thomas Koenig <tkoenig@gcc.gnu.org>
>
> * frontend_passes (expr_array): Replace by vec template.
> (expr_size): Remove.
> (expr_count): Remove.
> (doloop_list): Replace by vec template.
> (doloop_size): Remove.
> (gfc_run_passes): Adjust to use of vec template.
> (cfe_register_funcs): Likewise.
> (cfe_expr_0): Likewise.
> (doloop_code): Likewise.
> Index: frontend-passes.c
> ===================================================================
> --- frontend-passes.c (Revision 214281)
> +++ frontend-passes.c (Arbeitskopie)
> @@ -50,8 +50,7 @@ static int count_arglist;
> /* Pointer to an array of gfc_expr ** we operate on, plus its size
> and counter. */
>
> -static gfc_expr ***expr_array;
> -static int expr_size, expr_count;
> +static vec<gfc_expr **> expr_array = vec<gfc_expr **>();
that's usually written as just static vec<T> foo; vec doesn't actually
have ctors, and 0 initialization works fine.
> /* Pointer to the gfc_code we currently work on - to be able to insert
> a block before the statement. */
> @@ -81,9 +80,10 @@ static int iterator_level;
>
> /* Keep track of DO loop levels. */
>
> -static gfc_code **doloop_list;
> -static int doloop_size, doloop_level;
> +static vec<gfc_code *> doloop_list = vec<gfc_code *>();
same
> @@ -101,23 +101,19 @@ gfc_run_passes (gfc_namespace *ns)
> /* Warn about dubious DO loops where the index might
> change. */
>
> - doloop_size = 20;
> doloop_level = 0;
> - doloop_list = XNEWVEC(gfc_code *, doloop_size);
> + // doloop_list = ;
what is this comment supposed to mean?
> doloop_warn (ns);
> - XDELETEVEC (doloop_list);
> + doloop_list.truncate (0);
.release () would be more typical.
>
> if (gfc_option.flag_frontend_optimize)
> {
> - expr_size = 20;
> - expr_array = XNEWVEC(gfc_expr **, expr_size);
> -
> optimize_namespace (ns);
> optimize_reduction (ns);
> if (gfc_option.dump_fortran_optimized)
> gfc_dump_parse_tree (ns, stdout);
>
> - XDELETEVEC (expr_array);
> + expr_array.truncate (0);
same
> @@ -608,36 +599,35 @@ cfe_expr_0 (gfc_expr **e, int *walk_subtrees,
> return 0;
> }
>
> - expr_count = 0;
> + expr_array.truncate (0);
.release ()
> gfc_expr_walker (e, cfe_register_funcs, NULL);
>
> /* Walk through all the functions. */
>
> - for (i=1; i<expr_count; i++)
> + for (i=1; expr_array.iterate (i, &ei); i++)
FOR_EACH_VEC_ELT, though Its not really clear to my why that's better
than
size_t length = vec.length ();
for (size_t i = 0; i < length; i++)
// do something with vec[i]
> {
> /* Skip if the function has been replaced by a variable already. */
> - if ((*(expr_array[i]))->expr_type == EXPR_VARIABLE)
> + if ((*ei)->expr_type == EXPR_VARIABLE)
> continue;
>
> newvar = NULL;
> - for (j=0; j<i; j++)
> + for (j=0; j<i && expr_array.iterate (j, &ej); j++)
the .iterate call is useless since j must be < i, and the vector is
at least i long right?
Trev