[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#619963: testcase



Hi,

Attached is a simple testcase from VLC.

At -O0 everything is fine:
$ gcc-4.6 -S -O0 x.i
$ grep memmove x.s
        call    __memmove_chk

At -O1 it incorrectly it is incorrectly changed to memcpy:
$ gcc-4.6 -S -O1 x.i
$ grep memcpy x.s
        call    memcpy

If I change the provided x.i, and remove the extern inline declaration
of memmove, then memmove is no longer changed to memcpy!

Also all is good with gcc-4.5:
$ gcc-4.5 -S -O2 x.i
$ grep memmove x.s
        call    memmove

Poking around in gcc-4.6 sources this place in gcc/builtins.c seems to
be the place where memmove_chk -> memcpy conversion happens, I didn't
verify that though:

 if (fcode == BUILT_IN_MEMMOVE_CHK)
	{
	  unsigned int src_align
	    = get_pointer_alignment (src, BIGGEST_ALIGNMENT);

	  if (src_align == 0)
	    return NULL_RTX;

	  /* If src is categorized for a readonly section we can use
	     normal __memcpy_chk.  */
	  if (readonly_data_expr (src))
	    {
	      tree fn = built_in_decls[BUILT_IN_MEMCPY_CHK];



Best regards,
--Edwin
typedef long unsigned int size_t;
extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__, __artificial__)) void * __attribute__ ((__nothrow__)) memmove (void *__restrict __dest, __const void *__restrict __src, size_t __len)  {
     return __builtin___memmove_chk (__dest, __src, __len, __builtin_object_size (__dest, 0));
}
typedef struct aout_instance_t aout_instance_t;
typedef struct aout_input_t aout_input_t;
struct aout_instance_t {
    aout_input_t * pp_inputs[5];
    int i_nb_inputs;
};

int aout_DecDelete( aout_instance_t * p_aout, aout_input_t * p_input ) {
    int i_input = p_aout->i_nb_inputs;
    memmove( &p_aout->pp_inputs[i_input], &p_aout->pp_inputs[i_input + 1], (5 - i_input - 1) * sizeof(aout_input_t *) );
}

Reply to: