I've stumbled across a ROMCC bug that results in incorrect code being 
generated. As near as I can tell, multi-layer "if" statements are at risk 
of being miscompiled when optimization is enabled. The following program 
snippet induces the bug when compiled via "romcc -mcpu=p4 -O2" (or -O):

/************************************************/
void die(void)
{
}

static void miscompiled_function(unsigned short param)
{
        unsigned int data = __builtin_inl(0);
        
        if (data == 0)
                param = 12;
        else if (data == 4)
                param = 42;
        else
                die();

        __builtin_outl(param, 0);
}

static void internal_compiler_error(unsigned short param)
{
        unsigned int data = __builtin_inl(0);
        
        if (data == 0)
                param = 12;
        if (data == 4)
                param = 42;
        if ((data != 0) && (data != 4))
                die();

        __builtin_outl(param, 0);
}

void main(void)
{
        miscompiled_function(0);
//      internal_compiler_error(0);
} 

/************************************************/

The assembly output for the miscompiled function is such that when data == 
4, param is set to zero, instead of 42.

The function 'internal_compiler_error' is logically equivalent to 
'miscompiled_function', but attempting to call it results in the following 
message:

bug.c:20.1: bug.c:36.32: warning: edge:
bug.c:20.1: bug.c:36.32: warning:  0x9e53b08 copy
:0.0: warning:  0x9e542d8 convert
<built-in>:1.0: bug.c:21.42: bug.c:36.32: warning: def:
<built-in>:1.0: bug.c:21.42: bug.c:36.32: warning:  0x9e53ea8 __inl
<built-in>:1.0: bug.c:21.42: bug.c:36.32:
0x9e53ea8 __inl      Internal compiler error: live range with already used 
color %eax
Aborted

-----------------------------
Steve Magnani
www.digidescorp.com



_______________________________________________
LinuxBIOS mailing list
[email protected]
http://www.openbios.org/mailman/listinfo/linuxbios

Reply via email to