re PR tree-optimization/16951 (ICE in make_decl_rtl with recursion in C++ constructor...
authorAlexandre Oliva <aoliva@redhat.com>
Mon, 13 Dec 2004 21:03:47 +0000 (21:03 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Mon, 13 Dec 2004 21:03:47 +0000 (21:03 +0000)
gcc/ChangeLog:
PR tree-opt/16951
* tree-inline.c (setup_one_parameter): Don't directly map a
parameter to the address of another variable of the same
function.
gcc/testsuite/ChangeLog:
PR tree-opt/16951
* gcc.c-torture/compile/20041211-1.c: New.

From-SVN: r92106

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20041211-1.c [new file with mode: 0644]
gcc/tree-inline.c

index c792108..e12edaf 100644 (file)
@@ -1,3 +1,10 @@
+2004-12-13  Alexandre Oliva  <aoliva@redhat.com>
+
+       PR tree-opt/16951
+       * tree-inline.c (setup_one_parameter): Don't directly map a
+       parameter to the address of another variable of the same
+       function.
+
 2004-13-12  Steven Bosscher  <stevenb@suse.de>
 
        * basic-block.h (PROP_POSTRELOAD): Do not include PROP_AUTOINC, we
index 8dd7e1c..647411e 100644 (file)
@@ -1,3 +1,8 @@
+2004-12-13  Alexandre Oliva  <aoliva@redhat.com>
+
+       PR tree-opt/16951
+       * gcc.c-torture/compile/20041211-1.c: New.
+
 2004-12-12  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
 
        PR middle-end/17564
diff --git a/gcc/testsuite/gcc.c-torture/compile/20041211-1.c b/gcc/testsuite/gcc.c-torture/compile/20041211-1.c
new file mode 100644 (file)
index 0000000..5b9c1d0
--- /dev/null
@@ -0,0 +1,13 @@
+/* PR tree-optimization/16951 */
+
+void dummy_use(const char *p);
+
+__inline void f(const char *const p) {
+  const char q;
+  dummy_use(p);
+  f(&q);
+}
+
+void crash() {
+  f(0);
+}
index 29740df..db2b236 100644 (file)
@@ -655,6 +655,22 @@ copy_body (inline_data *id)
   return body;
 }
 
+/* Return true if VALUE is an ADDR_EXPR of an automatic variable
+   defined in function FN, or of a data member thereof.  */
+
+static bool
+self_inlining_addr_expr (tree value, tree fn)
+{
+  tree var;
+
+  if (TREE_CODE (value) != ADDR_EXPR)
+    return false;
+
+  var = get_base_address (TREE_OPERAND (value, 0));
+             
+  return var && lang_hooks.tree_inlining.auto_var_in_fn_p (var, fn);
+}
+
 static void
 setup_one_parameter (inline_data *id, tree p, tree value, tree fn,
                     tree *init_stmts, tree *vars, bool *gimplify_init_stmts_p)
@@ -679,7 +695,13 @@ setup_one_parameter (inline_data *id, tree p, tree value, tree fn,
         It is not big deal to prohibit constant propagation here as
         we will constant propagate in DOM1 pass anyway.  */
       if (is_gimple_min_invariant (value)
-         && lang_hooks.types_compatible_p (TREE_TYPE (value), TREE_TYPE (p)))
+         && lang_hooks.types_compatible_p (TREE_TYPE (value), TREE_TYPE (p))
+         /* We have to be very careful about ADDR_EXPR.  Make sure
+            the base variable isn't a local variable of the inlined
+            function, e.g., when doing recursive inlining, direct or
+            mutually-recursive or whatever, which is why we don't
+            just test whether fn == current_function_decl.  */
+         && ! self_inlining_addr_expr (value, fn))
        {
          insert_decl_map (id, p, value);
          return;