Repeat opts until there are no more changes
git-svn-id: svn://svn.cc65.org/cc65/trunk@684 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
@@ -1550,9 +1550,13 @@ static void OptDeadJumps (void)
|
|||||||
static void OptLoads (void)
|
static void OptLoads (void)
|
||||||
/* Remove unnecessary loads of values */
|
/* Remove unnecessary loads of values */
|
||||||
{
|
{
|
||||||
Line* L2 [10];
|
unsigned Changes;
|
||||||
|
|
||||||
|
do {
|
||||||
|
|
||||||
|
Line* L2 [10];
|
||||||
Line* L = FirstCode;
|
Line* L = FirstCode;
|
||||||
|
Changes = 0;
|
||||||
while (L) {
|
while (L) {
|
||||||
|
|
||||||
/* Check for
|
/* Check for
|
||||||
@@ -1598,6 +1602,9 @@ static void OptLoads (void)
|
|||||||
/* Delete the remaining lines */
|
/* Delete the remaining lines */
|
||||||
FreeLines (L2 [0], L2 [3]);
|
FreeLines (L2 [0], L2 [3]);
|
||||||
|
|
||||||
|
/* We have changes */
|
||||||
|
++Changes;
|
||||||
|
|
||||||
/* Check for
|
/* Check for
|
||||||
*
|
*
|
||||||
* ldy #$xx
|
* ldy #$xx
|
||||||
@@ -1645,6 +1652,9 @@ static void OptLoads (void)
|
|||||||
/* Delete the remaining lines */
|
/* Delete the remaining lines */
|
||||||
FreeLines (L2 [0], L2 [3]);
|
FreeLines (L2 [0], L2 [3]);
|
||||||
|
|
||||||
|
/* We have changes */
|
||||||
|
++Changes;
|
||||||
|
|
||||||
/* Search for:
|
/* Search for:
|
||||||
*
|
*
|
||||||
* lda (sp),y
|
* lda (sp),y
|
||||||
@@ -1662,6 +1672,9 @@ static void OptLoads (void)
|
|||||||
L = ReplaceLine (L, "\tjsr\tpushaysp");
|
L = ReplaceLine (L, "\tjsr\tpushaysp");
|
||||||
FreeLine (L2 [0]);
|
FreeLine (L2 [0]);
|
||||||
|
|
||||||
|
/* We have changes */
|
||||||
|
++Changes;
|
||||||
|
|
||||||
/* Search for:
|
/* Search for:
|
||||||
*
|
*
|
||||||
* ldx xx
|
* ldx xx
|
||||||
@@ -1691,6 +1704,9 @@ static void OptLoads (void)
|
|||||||
FreeLine (L2[2]);
|
FreeLine (L2[2]);
|
||||||
L = L2[1];
|
L = L2[1];
|
||||||
|
|
||||||
|
/* We have changes */
|
||||||
|
++Changes;
|
||||||
|
|
||||||
/* Search for:
|
/* Search for:
|
||||||
*
|
*
|
||||||
* ldx xx
|
* ldx xx
|
||||||
@@ -1728,6 +1744,9 @@ static void OptLoads (void)
|
|||||||
/* Remove the remaining lines */
|
/* Remove the remaining lines */
|
||||||
FreeLines (L2[1], L2[2]);
|
FreeLines (L2[1], L2[2]);
|
||||||
|
|
||||||
|
/* We have changes */
|
||||||
|
++Changes;
|
||||||
|
|
||||||
/* Search for:
|
/* Search for:
|
||||||
*
|
*
|
||||||
* ldx xx
|
* ldx xx
|
||||||
@@ -1763,6 +1782,9 @@ static void OptLoads (void)
|
|||||||
/* Remove the remaining line */
|
/* Remove the remaining line */
|
||||||
FreeLine (L2[1]);
|
FreeLine (L2[1]);
|
||||||
|
|
||||||
|
/* We have changes */
|
||||||
|
++Changes;
|
||||||
|
|
||||||
/* Search for
|
/* Search for
|
||||||
*
|
*
|
||||||
* adc xx
|
* adc xx
|
||||||
@@ -1783,6 +1805,9 @@ static void OptLoads (void)
|
|||||||
/* Delete the lines */
|
/* Delete the lines */
|
||||||
FreeLines (L2[0], L2[1]->Next);
|
FreeLines (L2[0], L2[1]->Next);
|
||||||
|
|
||||||
|
/* We have changes */
|
||||||
|
++Changes;
|
||||||
|
|
||||||
/* Search for
|
/* Search for
|
||||||
*
|
*
|
||||||
* sbc xx
|
* sbc xx
|
||||||
@@ -1802,8 +1827,34 @@ static void OptLoads (void)
|
|||||||
|
|
||||||
/* Delete the lines */
|
/* Delete the lines */
|
||||||
FreeLines (L2[0], L2[1]->Next);
|
FreeLines (L2[0], L2[1]->Next);
|
||||||
}
|
|
||||||
|
|
||||||
|
/* We have changes */
|
||||||
|
++Changes;
|
||||||
|
|
||||||
|
/* Search for
|
||||||
|
*
|
||||||
|
* lda xx
|
||||||
|
* bpl *+3
|
||||||
|
* dex
|
||||||
|
*
|
||||||
|
* Remove the handling of the high byte if the X register
|
||||||
|
* is not used any more
|
||||||
|
*/
|
||||||
|
} else if (LineMatch (L, "\tlda\t") &&
|
||||||
|
GetNextCodeLines (L, L2, 3) &&
|
||||||
|
LineFullMatch (L2[0], "\tbpl\t*+3") &&
|
||||||
|
LineFullMatch (L2[1], "\tdex") &&
|
||||||
|
L2[1]->Next &&
|
||||||
|
IsHint (L2[1]->Next, "x:!") &&
|
||||||
|
!RegXUsed (L2[1])) {
|
||||||
|
|
||||||
|
/* Delete the lines */
|
||||||
|
FreeLines (L2[0], L2[1]->Next);
|
||||||
|
|
||||||
|
/* We have changes */
|
||||||
|
++Changes;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* All other patterns start with this one: */
|
/* All other patterns start with this one: */
|
||||||
if (!LineFullMatch (L, "\tldx\t#$00")) {
|
if (!LineFullMatch (L, "\tldx\t#$00")) {
|
||||||
@@ -1829,6 +1880,9 @@ static void OptLoads (void)
|
|||||||
|
|
||||||
/* Remove the unnecessary line */
|
/* Remove the unnecessary line */
|
||||||
FreeLine (L2[0]);
|
FreeLine (L2[0]);
|
||||||
|
|
||||||
|
/* We have changes */
|
||||||
|
++Changes;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Search for:
|
/* Search for:
|
||||||
@@ -1858,6 +1912,9 @@ static void OptLoads (void)
|
|||||||
|
|
||||||
/* L must be valid */
|
/* L must be valid */
|
||||||
L = L2 [0];
|
L = L2 [0];
|
||||||
|
|
||||||
|
/* We have changes */
|
||||||
|
++Changes;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1885,6 +1942,9 @@ static void OptLoads (void)
|
|||||||
|
|
||||||
/* L must be valid */
|
/* L must be valid */
|
||||||
L = L2 [0];
|
L = L2 [0];
|
||||||
|
|
||||||
|
/* We have changes */
|
||||||
|
++Changes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1911,13 +1971,18 @@ static void OptLoads (void)
|
|||||||
|
|
||||||
/* L must be valid */
|
/* L must be valid */
|
||||||
L = L2 [0];
|
L = L2 [0];
|
||||||
|
|
||||||
|
/* We have changes */
|
||||||
|
++Changes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NextLine:
|
NextLine:
|
||||||
/* Go to the next line */
|
/* Go to the next line */
|
||||||
L = NextCodeLine (L);
|
L = NextCodeLine (L);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} while (Changes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user