------- Comment #4 from matz at gcc dot gnu dot org  2009-05-01 17:22 -------
That shouldn't happen yes.  We are trying to expand
  __fixunstfdi (D.1248_5)
As far as the gimple side is concerned this is a normal pass-by-value call
hence the SSA name therein is perfectly fine.  But it seems the setup for
this call transforms it into actually being passed by reference:

#6  0x00000000005b0d41 in precompute_register_parameters (num_actuals=1,
    args=0x7fffffff6340, reg_parm_seen=0x7fffffff654c)
    at ../../gcc/gcc/calls.c:677
677                 args[i].value = expand_normal (args[i].tree_value);
(gdb) p debug_generic_expr (args[i].tree_value)
&D.1248_5

That comes at a surprise for the expander because you can't take addresses
of SSA names as easily, the object therein needs to be marked as having the
address taken.  Even if we would handle SSA names like VAR_DECLs in
expand_expr_addr_expr_1 it wouldn't help.  Those are simply expanded and
then its expected that the returned thing is a MEM_P.  Which it normally
isn't for SSA names, it will be a pseudo reg, so the other assert would 
trigger:
      if (DECL_P (exp)
        ...
          result = expand_expr (exp, target, tmode,
                                modifier == EXPAND_INITIALIZER
                                ? EXPAND_INITIALIZER : EXPAND_CONST_ADDRESS);

          /* If the DECL isn't in memory, then the DECL wasn't properly
             marked TREE_ADDRESSABLE, which will be either a front-end
             or a tree optimizer bug.  */
          gcc_assert (MEM_P (result));

I see code in initialize_argument_information (around calls.c:1072) which
reads as if it wants to deal with this issue, copying the real argument to
some temporary storage and passing the address of that temporary storage.

But it takes the shortcut route at calls.c:1061:

          if (call_from_thunk_p
              || (callee_copies
                  && !TREE_ADDRESSABLE (type)
                  && (base = get_base_address (args[i].tree_value))
                  && (!DECL_P (base) || MEM_P (DECL_RTL (base)))))
            {
              /* We can't use sibcalls if a callee-copied argument is
                 stored in the current function's frame.  */
              if (!call_from_thunk_p && DECL_P (base) && !TREE_STATIC (base))
                *may_tailcall = false;

              args[i].tree_value = build_fold_addr_expr (args[i].tree_value);

It is taken because SSA-names are !DECL_P.  We probably have to handle SSA
names here as if they are DECLs with a REG_P DECL_RTL.  At least the patch
below will fix the compilation of the testcase, if you could give it a test
that would be nice:

Index: calls.c
===================================================================
--- calls.c     (Revision 146955)
+++ calls.c     (Arbeitskopie)
@@ -1054,6 +1054,7 @@ initialize_argument_information (int num
              || (callee_copies
                  && !TREE_ADDRESSABLE (type)
                  && (base = get_base_address (args[i].tree_value))
+                 && TREE_CODE (base) != SSA_NAME
                  && (!DECL_P (base) || MEM_P (DECL_RTL (base)))))
            {
              /* We can't use sibcalls if a callee-copied argument is


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39977

Reply via email to