From: <no...@so...> - 2002-08-26 16:55:07
|
Bugs item #597681, was opened at 2002-08-20 10:05 You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=597681&group_id=599 Category: C-Front End Group: None Status: Open Resolution: Remind Priority: 5 Submitted By: Nick Craig-Wood (ncw) Assigned to: Bernhard Held (bernhardheld) Summary: Optimiser bug Initial Comment: This is a rather complicated bug! I've tried to prune the example program down to the minimum but there are still a few seemingly irrelevant lines in there. It seems that the correct optimisation in f1() causes an incorrect optimisation in f2(). Note that I haven't been able to trigger the incorrect optimisation without having f1() before f2(). Note also that if you remove any of the other function calls the optimisation bug goes away. There is also a mis-reporting of "use of uninitialised variable" in f1() which may be related or may not. This was tried on an sdcc built from CVS today under linux. See below for the exact problem. #define MICROCONTROLLER_P80C552 1 #include <mcs51reg.h> typedef unsigned char u8; typedef unsigned int u16; extern void menu_status(u8 message); extern u8 pio_a_get(u8 mask); extern void pio_b_set(u8 on, u8 mask); extern void sleep_cs(u16 cs); extern void error_display(u8 error); extern void timeout_start(u16 cs); u8 f1(void) { u8 error = 0; menu_status(39); timeout_start(400); pio_b_set(1,(1<<6)); if (error) error_display(error); else menu_status(38); return error; // This is a correct optimisation - error is always 0 and sdcc // optimises away the if statement. There is a spurious warning about // error though. However this optimisation is needed to trigger the // real bug in the next function // bug3.c:23: warning: conditional flow changed by optimizer 'bug3.c(19)':so said EVELYN the modified DOG // bug3.c:23: warning: 'auto' variable 'error' may be used before initialization at bug3.c(20) // bug3.c:23: warning: unreachable code bug3.c(20) } static u8 f2(void) { menu_status(104); pio_b_set(0,(1<<2)); sleep_cs(100); // Mis-optimisation - sdcc optimises this if statement away completely // which it can't because P5 is an IO port. It requires the previous // function and all the extra function calls. if ((P5 & (1<<3))) return 18; return 0; // bug3.c:47: warning: conditional flow changed by optimizer 'bug3.c(44)':so said EVELYN the modified DOG // bug3.c:47: warning: unreachable code bug3.c(45) } ---------------------------------------------------------------------- >Comment By: Nick Craig-Wood (ncw) Date: 2002-08-26 16:55 Message: Logged In: YES user_id=220462 Sorry! Here are the compiler options I've been using sdcc -mmcs51 --model-large --stack-after-data If you remove the --model-large then the bug isn't exhibited. ---------------------------------------------------------------------- Comment By: Bernhard Held (bernhardheld) Date: 2002-08-24 11:52 Message: Logged In: YES user_id=203539 Not reproducable. Did you use any compiler-options? ; ncw.c:48: if ((P5 & (1<<3))) ; genAnd mov a,_P5 ; genIfxJump ; Peephole 111 removed ljmp by inverse jump logic jnb acc.3,00102$ 00106$: ; ncw.c:49: return 18; ; genRet mov dpl,#0x12 ; Peephole 132 changed ljmp to sjmp sjmp 00103$ 00102$: ; ncw.c:51: return 0; ; genRet mov dpl,#0x00 00103$: ret ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=597681&group_id=599 |