From fa957afc1b80b11a18e973e8249dfa40b59ce280 Mon Sep 17 00:00:00 2001 From: johanknol Date: Sun, 22 Apr 2001 19:22:00 +0000 Subject: [PATCH] Don't ignore casts git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@751 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- src/SDCCcse.c | 53 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/src/SDCCcse.c b/src/SDCCcse.c index 43c469a2..a8e0e005 100644 --- a/src/SDCCcse.c +++ b/src/SDCCcse.c @@ -253,26 +253,38 @@ DEFSETFUNC (findCheaperOp) /* do a special check this will help in */ /* constant propagation & dead code elim */ /* for assignments only */ - if (cdp->diCode->op == '=') - { - /* if the result is volatile then return result */ - if (IS_OP_VOLATILE (IC_RESULT (cdp->diCode))) - *opp = IC_RESULT (cdp->diCode); - else - /* if this is a straight assignment and - left is a temp then prefer the temporary to the - true symbol */ - if (!POINTER_SET (cdp->diCode) && - IS_ITEMP (IC_RESULT (cdp->diCode)) && - IS_TRUE_SYMOP (IC_RIGHT (cdp->diCode))) + if (cdp->diCode->op == '=') { + /* if the result is volatile then return result */ + if (IS_OP_VOLATILE (IC_RESULT (cdp->diCode))) + *opp = IC_RESULT (cdp->diCode); + else + /* if this is a straight assignment and + left is a temp then prefer the temporary to the + true symbol */ + if (!POINTER_SET (cdp->diCode) && + IS_ITEMP (IC_RESULT (cdp->diCode)) && + IS_TRUE_SYMOP (IC_RIGHT (cdp->diCode))) *opp = IC_RESULT (cdp->diCode); - else + else { /* if straight assignement && and both are temps then prefer the one that will not need extra space to spil, also take into consideration if right side an induction variable - */ + */ + +#if SomeOneUnderStandsThis + /* This causes the bug: + + void test (unsigned u) { + // the following cast is ignored + for (; (int) u >= 0;) + ++u; + } + } + + where casts are ignored */ + if (!POINTER_SET (cdp->diCode) && IS_ITEMP (IC_RESULT (cdp->diCode)) && IS_ITEMP (IC_RIGHT (cdp->diCode)) && @@ -281,12 +293,13 @@ DEFSETFUNC (findCheaperOp) SPIL_LOC (IC_RESULT (cdp->diCode))) || (SPIL_LOC (IC_RESULT (cdp->diCode)) && SPIL_LOC (IC_RESULT (cdp->diCode)) == - SPIL_LOC (IC_RIGHT (cdp->diCode)))) - ) - *opp = IC_RESULT (cdp->diCode); - else - *opp = IC_RIGHT (cdp->diCode); - } + SPIL_LOC (IC_RIGHT (cdp->diCode))))) + *opp = IC_RESULT (cdp->diCode); + else + *opp = IC_RIGHT (cdp->diCode); +#endif + } + } else *opp = IC_RESULT (cdp->diCode); } -- 2.30.2