[fpc-devel] An optimizer bug?

Sergei Gorelkin sergei_gorelkin at mail.ru
Thu Dec 27 06:46:54 CET 2007


Hello,

It looks like my experiments with returning strings in parameters 
introduced (or, more likely, triggered an existing) bug.

First, attached is the patch itself. It is pretty trivial, and it works 
fine with smaller programs. Compiling the compiler itself also works, 
but only if -O2 is not specified. With -O2 it starts crashing.

Digging in shows that the faulting function is cfileutl.PathExists(), 
and its assembler code looks this:

// no optimization, code is correct
CFILEUTL_PATHEXISTS$ANSISTRING$BOOLEAN$$BOOLEAN:
		push	ebp
		mov	ebp,esp
		sub	esp,24
		mov	dword ptr [ebp-4],eax
		mov	byte ptr [ebp-8],dl
; Initializing two temps
		mov	dword ptr [ebp-20],0
		mov	dword ptr [ebp-24],0
		cmp	dword ptr [ebp-4],0
		je	@@j954
		jmp	@@j955

// with -O2
CFILEUTL_PATHEXISTS$ANSISTRING$BOOLEAN$$BOOLEAN:
		push	ebp
		mov	ebp,esp
		sub	esp,20
		mov	dword ptr [ebp-20],ebx
		mov	dword ptr [ebp-4],eax
		mov	bl,dl
; Bug here. The following two instructions should NOT have the same 
offsets! One of the temps is left uninitialized.
		mov	dword ptr [ebp-12],0
		mov	dword ptr [ebp-12],0
		test	eax,eax
		jne	@@j955

With unpatched compiler, there is only one temp in this function, so the 
described behaviour cannot be observed.
I think it's an existing bug because unoptimized code is correct, and 
the optimizer should never disrupt its correctness.
Anyway, I'm a bit lost at this point and need at least a hint where to look.

Best regards,
Sergei

-------------- next part --------------
A non-text attachment was scrubbed...
Name: string_ret.zip
Type: application/x-zip-compressed
Size: 644 bytes
Desc: not available
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20071227/b0b61a6b/attachment.bin>


More information about the fpc-devel mailing list