m68k: Simple loop compiles into boundless recursion with -O2
Liu Hao
lh_mouse@126.com
Fri Jan 15 02:23:13 GMT 2021
在 2021/1/14 上午12:30, Fredrik Noring 写道:
> Many thanks, Alexander,
>
>> Please invoke objdump with -dr instead to see the relocations.
>
> Indeed:
>
> 1a: 4eb9 0000 0000 jsr 0 <memset2>
> 1c: R_68K_32 memset
>
>> The relocation associated with this instruction should point to memset.
>> Most likely the compiler is optimizing your memset2 function to call
>> the standard function 'memset'.
>>
>> When implementing memset itself you need to pass -ffreestanding to GCC,
>> which will disable this optimization.
>
I used to run into the same issue around CRT code on x86. Use of `-ffreestanding` disables a number
of optimizations, for example, the compiler cannot optimize
int data[4];
memset(&data, 0, sizeof(data));
to a series of store operations, but leave it as a function call, which is rather overkill.
The issue in the original post can be resolved by writing through a pointer to `volatile char` like
this:
void *memset2(void *s, int c, unsigned int n)
{
volatile char *b = s;
for (unsigned int i = 0; i < n; i++)
b[i] = c;
return s;
}
--
Best regards,
LH_Mouse
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://gcc.gnu.org/pipermail/gcc-help/attachments/20210115/3f85495f/attachment.sig>
More information about the Gcc-help
mailing list