[Bug regression/40001] [4.5 Regression] r146817 broke libgloss build for SPU

matz at gcc dot gnu dot org gcc-bugzilla@gcc.gnu.org
Sat May 2 02:34:00 GMT 2009



------- Comment #1 from matz at gcc dot gnu dot org  2009-05-02 02:34 -------
The assert triggers because of a real pre-existing bug.  local variables
with DECL_HARD_REGISTER set must not be put into SSA form.  is_gimple_reg
has to return false for them.  It doesn't anymore since some changes by richi
(CCed), I think.

Te update_address_taken pass sets DECL_GIMPLE_REG_P on the sp_r1 variable.
This is because of the special handling of vector modes.  But it doesn't take
into account variables which can't be gimple_reg for other reasons than simply
being of wrong type.

I think the 2009-03-31 change in is_gimple_reg that moved the DECL_GIMPLE_REG_P
handling earlier might be the cause.  But fixing it there
probably is not enough, it's better to not set DECL_GIMPLE_REG_P at all
on this VAR_DECL.

The same is true for volatile decl (in this example it has a hardreg _and_
is volatile even), which also seems to be ignored in the address_taken
pass.

This whole business of special-casing COMPLEX_TYPE and VECTOR_TYPE regarding
gimple regs seems highly dubious to me.  The different places setting this
flag freely use a random mixture of tests on
          !TREE_THIS_VOLATILE (t)
and/or
          (TREE_CODE (t) == VAR_DECL && !DECL_HARD_REGISTER (t))
and/or
          !needs_to_live_in_memory (t))
or sometimes nothing at all.  In fact at least all three of these tests
are required everywhere, except where it's clear that we just created a 
completely new temporary.

Meanwhile the immediate problem can be fixed by the below patch:

Index: tree-ssa.c
===================================================================
--- tree-ssa.c  (Revision 147044)
+++ tree-ssa.c  (Arbeitskopie)
@@ -1573,7 +1573,10 @@ execute_update_addresses_taken (bool do_
        if (!DECL_GIMPLE_REG_P (var)
            && !bitmap_bit_p (not_reg_needs, DECL_UID (var))
            && (TREE_CODE (TREE_TYPE (var)) == COMPLEX_TYPE
-               || TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE))
+               || TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE)
+           && !TREE_THIS_VOLATILE (var)
+           && (TREE_CODE (var) == VAR_DECL && !DECL_HARD_REGISTER (var))
+           && !needs_to_live_in_memory (var))
          {
            DECL_GIMPLE_REG_P (var) = 1;
            mark_sym_for_renaming (var);


-- 

matz at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |rguenth at gcc dot gnu dot
                   |                            |org
            Summary|[4.5 Regression] r1467817   |[4.5 Regression] r146817
                   |broke libgloss build for SPU|broke libgloss build for SPU


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



More information about the Gcc-bugs mailing list