projects
/
fw
/
sdcc
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
src/mcs51/peeph.def: fixed bug #1076940
[fw/sdcc]
/
src
/
SDCCopt.c
diff --git
a/src/SDCCopt.c
b/src/SDCCopt.c
index 4e9c2a7be560647efde1841a42b6a0a9efcf780c..94ee6e187b5d0231dc418575b510578387eb20cd 100644
(file)
--- a/
src/SDCCopt.c
+++ b/
src/SDCCopt.c
@@
-176,7
+176,10
@@
cnvToFcall (iCode * ic, eBBlock * ebp)
IC_RESULT (newic) = IC_RESULT (ic);
newic->lineno = lineno;
newic->parmBytes+=bytesPushed;
IC_RESULT (newic) = IC_RESULT (ic);
newic->lineno = lineno;
newic->parmBytes+=bytesPushed;
-
+ ebp->hasFcall = 1;
+ if (currFunc)
+ FUNC_HASFCALL (currFunc->type) = 1;
+
if(TARGET_IS_PIC16) {
/* normally these functions aren't marked external, so we can use their
* _extern field to marked as already added to symbol table */
if(TARGET_IS_PIC16) {
/* normally these functions aren't marked external, so we can use their
* _extern field to marked as already added to symbol table */
@@
-264,6
+267,9
@@
found:
newic = newiCode (CALL, operandFromSymbol (func), NULL);
IC_RESULT (newic) = IC_RESULT (ic);
newic->parmBytes+=bytesPushed;
newic = newiCode (CALL, operandFromSymbol (func), NULL);
IC_RESULT (newic) = IC_RESULT (ic);
newic->parmBytes+=bytesPushed;
+ ebp->hasFcall = 1;
+ if (currFunc)
+ FUNC_HASFCALL (currFunc->type) = 1;
if(TARGET_IS_PIC16) {
/* normally these functions aren't marked external, so we can use their
if(TARGET_IS_PIC16) {
/* normally these functions aren't marked external, so we can use their
@@
-354,6
+360,9
@@
found:
newic = newiCode (CALL, operandFromSymbol (func), NULL);
IC_RESULT (newic) = IC_RESULT (ic);
newic->parmBytes+=bytesPushed;
newic = newiCode (CALL, operandFromSymbol (func), NULL);
IC_RESULT (newic) = IC_RESULT (ic);
newic->parmBytes+=bytesPushed;
+ ebp->hasFcall = 1;
+ if (currFunc)
+ FUNC_HASFCALL (currFunc->type) = 1;
if(TARGET_IS_PIC16) {
/* normally these functions aren't marked external, so we can use their
if(TARGET_IS_PIC16) {
/* normally these functions aren't marked external, so we can use their
@@
-517,6
+526,9
@@
found:
IC_RESULT (newic) = IC_RESULT (ic);
newic->lineno = lineno;
newic->parmBytes+=bytesPushed; // to clear the stack after the call
IC_RESULT (newic) = IC_RESULT (ic);
newic->lineno = lineno;
newic->parmBytes+=bytesPushed; // to clear the stack after the call
+ ebp->hasFcall = 1;
+ if (currFunc)
+ FUNC_HASFCALL (currFunc->type) = 1;
if(TARGET_IS_PIC16) {
/* normally these functions aren't marked external, so we can use their
if(TARGET_IS_PIC16) {
/* normally these functions aren't marked external, so we can use their
@@
-611,10
+623,7
@@
convertToFcall (eBBlock ** ebbs, int count)
static int
isLocalWithoutDef (symbol * sym)
{
static int
isLocalWithoutDef (symbol * sym)
{
- if (!sym->level)
- return 0;
-
- if (IS_STATIC (sym->etype))
+ if (!IS_AUTO (sym))
return 0;
if (IS_VOLATILE (sym->type))
return 0;
if (IS_VOLATILE (sym->type))
@@
-874,7
+883,8
@@
killDeadCode (eBBlock ** ebbs, int count)
if (IC_RESULT (ic) && POINTER_SET (ic))
continue;
if (IC_RESULT (ic) && POINTER_SET (ic))
continue;
- if (POINTER_GET (ic) && IS_VOLATILE (operandType (IC_LEFT (ic))->next))
+ if (POINTER_GET (ic) && IS_VOLATILE (operandType (IC_LEFT (ic))->next)
+ && !SPIL_LOC (IC_RESULT (ic)))
continue;
/* if the result is used in the remainder of the */
continue;
/* if the result is used in the remainder of the */
@@
-938,6
+948,16
@@
killDeadCode (eBBlock ** ebbs, int count)
volRight = FALSE;
}
volRight = FALSE;
}
+ if (POINTER_GET (ic) && IS_VOLATILE (operandType (IC_LEFT (ic))->next))
+ {
+ if (SPIL_LOC (IC_RESULT (ic)))
+ {
+ IC_RESULT (ic) = newiTempFromOp (IC_RESULT (ic));
+ SPIL_LOC (IC_RESULT (ic)) = NULL;
+ }
+ continue;
+ }
+
change = 1;
gchange++;
change = 1;
gchange++;