Hi,

I got a few size regressions when moving from 4.5.3 to 4.6.1, all due to the same issue.

I have code that is basically a double word memory move:
void simple1(uint32 *a, uint32 *b) { *a = *b; }

GCC 4.6.1 is from this gimple:
simple1 (uint32 * a, uint32 * b)
{
  uint32 D.1927;

  # BLOCK 2 freq:10000
  # PRED: ENTRY [100.0%]  (fallthru,exec)
  D.1927_2 = *b_1(D);
  *a_3(D) = D.1927_2;
  return;
  # SUCC: EXIT [100.0%]

}

calling gen_movhi twice with:
call1 :
operand[0]: (reg:HI 19 [ D.1927 ])
operand[1]: (mem:HI (reg/v/f:QI 21 [ b ]))

call2 :
operand[0]: (mem:HI (reg/v/f:QI 20 [ a ]))
operand[1]: (reg:HI 19 [ D.1927 ])

while GCC 4.5.3 for _exactly_ the same gimple (as far as it is shown in the logs) it only calls gen_movhi with:
operand[0]: (mem:HI (reg/v/f:QI 20 [ a ]))
operand[1]: (mem:HI (reg/v/f:QI 21 [ b ]))

This seems to boil down to code that looks exactly the same between 4.5.3-4.6.1 in cfgexpand.c, expand_gimple_basic_block:
              def_operand_p def_p;
              def_p = SINGLE_SSA_DEF_OPERAND (stmt, SSA_OP_DEF);

              if (def_p != NULL)
                {
                  /* Ignore this stmt if it is in the list of
                     replaceable expressions.  */
                  if (SA.values
                      && bitmap_bit_p (SA.values,
                                       SSA_NAME_VERSION (DEF_FROM_PTR (def_p))))
                    continue;
                }
              last = expand_gimple_stmt (stmt);
              maybe_dump_rtl_for_gimple_stmt (stmt, last);
        

gcc4.5.3 hits continue the first time it gets there and gcc4.6.1 fails the inner if and enters expand_gimple_stmt twice.

From the comment in ssaexpand.h for the definition of SA.values, it says:
/* For an SSA name version V bit V is set iff TER decided that

     its definition should be forwarded.  */
  bitmap values;

What is TER? Any hints on why GCC 4.6.1 has now a different behaviour to GCC 4.5.3?

Cheers,
--
Paulo Matos

Reply via email to