[fpc-devel] "Wrong" evaluation of longbool on AVR

Florian Klämpfl florian at freepascal.org
Sat Sep 7 22:19:57 CEST 2019

Am 07.09.19 um 21:49 schrieb Christo Crause:
> I am investigating test suite failures for the avr-embedded target.  The 
> first genuine failure is test/taddbool.pp (there are also a bunch of 
> incorrect exit values and other failures due to missing features such as 
> float, random, ansi/widestring etc.).  This test fails on the last 
> expression (longbool XOR longbool).  The following is a stripped down 
> test case illustrating the failure:
> Program TAddBool;
> var
>   lb1, lb2: longbool;
> begin
>    lb1 := true;
>    lb2 := true;
>    if lb1 xor lb2 then
>      Halt(1)
>    else
>      Halt(0);
> end.
>  From the node report (thanks Kit!) it appears that the compiler first 
> converts the longbools to boolean8, then perform the XOR, then convert 
> the boolean8 result back to longbool before evaluating the if 
> condition.  In this last type conversion there appear to be an error 
> (with reference to the attached assembler output): after label .Lj5 a 32 
> bit bool is recreated from the result of the 8 bit XOR node.  Note that 
> r18 contains the result of the 8 bit XOR result, however registers r19 - 
> r21 are used without initialization.  R19 in this example contains the 
> result of converting LB2 to an 8 bit bool, leading to the observed 
> incorrect result.
> Is this analysis correct?  If so, is this a code generation issue 
> limited to avr, or is it a higher level problem which affects other 
> processor types?  Would someone be willing to give me pointers on how to 
> fix this if the fix is not too involved?

Thanks for the analysis, I fixed it already, see r42938.

More information about the fpc-devel mailing list