public inbox for gcc-help@gcc.gnu.org
 help / color / mirror / Atom feed
* m68k: Simple loop compiles into boundless recursion with -O2
@ 2021-01-13 16:01 Fredrik Noring
  2021-01-13 16:09 ` Alexander Monakov
  2021-01-13 16:23 ` AW: " Stefan Franke
  0 siblings, 2 replies; 17+ messages in thread
From: Fredrik Noring @ 2021-01-13 16:01 UTC (permalink / raw)
  To: gcc-help

Hi,

Compiler used is GCC m68k-elf version 10.2.0. A variant of the classic
memset

	void *memset2(void *s, int c, unsigned int n)
	{
		char *b = s;
		for (unsigned int i = 0; i < n; i++)
			b[i] = c;
		return s;
	}

compiles into boundless recursion with O2 optimisation and the m68k-elf
target. This will, of course, exhaust the stack and crash badly.

The commands

	m68k-elf-gcc -O2 -march=68000 -c -o memset2.o memset2.c
	m68k-elf-objdump -d memset2.o

produce

	00000000 <memset2>:
	   0:	2f02           	movel %d2,%sp@-
	   2:	242f 0008      	movel %sp@(8),%d2
	   6:	202f 0010      	movel %sp@(16),%d0
	   a:	6718           	beqs 24 <memset2+0x24>
	   c:	2f00           	movel %d0,%sp@-
	   e:	102f 0013      	moveb %sp@(19),%d0
	  12:	4880           	extw %d0
	  14:	3040           	moveaw %d0,%a0
	  16:	2f08           	movel %a0,%sp@-
	  18:	2f02           	movel %d2,%sp@-
	  1a:	4eb9 0000 0000 	jsr 0 <memset2>   /* <<<--- recursion */
	  20:	4fef 000c      	lea %sp@(12),%sp
	  24:	2002           	movel %d2,%d0
	  26:	241f           	movel %sp@+,%d2
	  28:	4e75           	rts

O1 optimisation is more reasonable, as it instead produces

	00000000 <memset2>:
	   0:	2f02           	movel %d2,%sp@-
	   2:	202f 0008      	movel %sp@(8),%d0
	   6:	242f 000c      	movel %sp@(12),%d2
	   a:	4aaf 0010      	tstl %sp@(16)
	   e:	670e           	beqs 1e <memset2+0x1e>
	  10:	2040           	moveal %d0,%a0
	  12:	222f 0010      	movel %sp@(16),%d1
	  16:	d280           	addl %d0,%d1
	  18:	10c2           	moveb %d2,%a0@+
	  1a:	b288           	cmpl %a0,%d1
	  1c:	66fa           	bnes 18 <memset2+0x18>
	  1e:	241f           	movel %sp@+,%d2
	  20:	4e75           	rts

The machine code with O2 looks like a plain compiler bug to me.

What to do?

Fredrik

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2021-01-15  6:23 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-13 16:01 m68k: Simple loop compiles into boundless recursion with -O2 Fredrik Noring
2021-01-13 16:09 ` Alexander Monakov
2021-01-13 16:30   ` Fredrik Noring
2021-01-13 19:20     ` Segher Boessenkool
2021-01-13 19:53       ` Fredrik Noring
2021-01-13 21:46         ` Segher Boessenkool
2021-01-13 21:54           ` AW: " Stefan Franke
2021-01-14 14:54           ` Fredrik Noring
2021-01-14 15:05             ` Alexander Monakov
2021-01-14 15:09               ` Alexander Monakov
2021-01-14 15:15                 ` AW: " Stefan Franke
2021-01-14 15:33                   ` Alexander Monakov
2021-01-14 15:56                     ` AW: " Stefan Franke
2021-01-15  2:23     ` Liu Hao
2021-01-15  6:23       ` Fredrik Noring
2021-01-13 16:23 ` AW: " Stefan Franke
2021-01-13 17:27   ` Fredrik Noring

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).