Hi!

PR83882 complains that PR81715 testcase fails on callee copies parameter
targets.  The following patch ought to fix that, but I have only
bootstrapped/regtested it on x86_64-linux and i686-linux + on the testcase
with hppa.

John, do you think you could test this on hppa without the callee copies
default change?

Or should we not care anymore if there aren't any similar targets left?

2018-01-17  Jakub Jelinek  <ja...@redhat.com>

        PR sanitizer/81715
        PR testsuite/83882
        * function.h (gimplify_parameters): Add gimple_seq * argument.
        * function.c: Include gimple.h and options.h.
        (gimplify_parameters): Add cleanup argument, add CLOBBER stmts
        for the added local temporaries if needed.
        * gimplify.c (gimplify_body): Adjust gimplify_parameters caller,
        if there are any parameter cleanups, wrap whole body into a
        try/finally with the cleanups.

--- gcc/function.h.jj   2018-01-03 10:19:53.858533740 +0100
+++ gcc/function.h      2018-01-16 14:31:21.409972177 +0100
@@ -607,7 +607,7 @@ extern bool initial_value_entry (int i,
 extern void instantiate_decl_rtl (rtx x);
 extern int aggregate_value_p (const_tree, const_tree);
 extern bool use_register_for_decl (const_tree);
-extern gimple_seq gimplify_parameters (void);
+extern gimple_seq gimplify_parameters (gimple_seq *);
 extern void locate_and_pad_parm (machine_mode, tree, int, int, int,
                                 tree, struct args_size *,
                                 struct locate_and_pad_arg_data *);
--- gcc/function.c.jj   2018-01-12 11:35:48.901222595 +0100
+++ gcc/function.c      2018-01-16 15:13:22.165665047 +0100
@@ -79,6 +79,8 @@ along with GCC; see the file COPYING3.
 #include "tree-ssa.h"
 #include "stringpool.h"
 #include "attribs.h"
+#include "gimple.h"
+#include "options.h"
 
 /* So we can assign to cfun in this file.  */
 #undef cfun
@@ -3993,7 +3995,7 @@ gimplify_parm_type (tree *tp, int *walk_
    statements to add to the beginning of the function.  */
 
 gimple_seq
-gimplify_parameters (void)
+gimplify_parameters (gimple_seq *cleanup)
 {
   struct assign_parm_data_all all;
   tree parm;
@@ -4058,6 +4060,16 @@ gimplify_parameters (void)
                  else if (TREE_CODE (type) == COMPLEX_TYPE
                           || TREE_CODE (type) == VECTOR_TYPE)
                    DECL_GIMPLE_REG_P (local) = 1;
+
+                 if (!is_gimple_reg (local)
+                     && flag_stack_reuse != SR_NONE)
+                   {
+                     tree clobber = build_constructor (type, NULL);
+                     gimple *clobber_stmt;
+                     TREE_THIS_VOLATILE (clobber) = 1;
+                     clobber_stmt = gimple_build_assign (local, clobber);
+                     gimple_seq_add_stmt (cleanup, clobber_stmt);
+                   }
                }
              else
                {
--- gcc/gimplify.c.jj   2018-01-16 12:21:15.895859416 +0100
+++ gcc/gimplify.c      2018-01-16 14:41:27.643872081 +0100
@@ -12589,7 +12589,7 @@ gbind *
 gimplify_body (tree fndecl, bool do_parms)
 {
   location_t saved_location = input_location;
-  gimple_seq parm_stmts, seq;
+  gimple_seq parm_stmts, parm_cleanup = NULL, seq;
   gimple *outer_stmt;
   gbind *outer_bind;
   struct cgraph_node *cgn;
@@ -12628,7 +12628,7 @@ gimplify_body (tree fndecl, bool do_parm
 
   /* Resolve callee-copies.  This has to be done before processing
      the body so that DECL_VALUE_EXPR gets processed correctly.  */
-  parm_stmts = do_parms ? gimplify_parameters () : NULL;
+  parm_stmts = do_parms ? gimplify_parameters (&parm_cleanup) : NULL;
 
   /* Gimplify the function's body.  */
   seq = NULL;
@@ -12657,6 +12657,13 @@ gimplify_body (tree fndecl, bool do_parm
       tree parm;
 
       gimplify_seq_add_seq (&parm_stmts, gimple_bind_body (outer_bind));
+      if (parm_cleanup)
+       {
+         gtry *g = gimple_build_try (parm_stmts, parm_cleanup,
+                                     GIMPLE_TRY_FINALLY);
+         parm_stmts = NULL;
+         gimple_seq_add_stmt (&parm_stmts, g);
+       }
       gimple_bind_set_body (outer_bind, parm_stmts);
 
       for (parm = DECL_ARGUMENTS (current_function_decl);

        Jakub

Reply via email to