mirror of
https://github.com/byteworksinc/ORCA-C.git
synced 2025-08-15 07:27:27 +00:00
Don't invalidly eliminate certain stores of 0 to global/static variables.
This could happen in native-code peephole optimization if two stz instructions targeting different global/static locations occurred consecutively.
This was a regression introduced by commit a3170ea7
.
The following program demonstrates the problem:
#pragma optimize 1+2+8+64
int i,j=1;
int main (void) {
i = 0;
j = 0;
return j; /* should return 0 */
}
This commit is contained in:
15
Native.pas
15
Native.pas
@@ -1740,13 +1740,16 @@ var
|
|||||||
|
|
||||||
{ kws }
|
{ kws }
|
||||||
{ stz $xx, stz $xx }
|
{ stz $xx, stz $xx }
|
||||||
m_stz_abs, m_stz_absX, m_stz_dir, m_stz_dirX:
|
m_stz_abs, m_stz_absX:
|
||||||
if npeep[ns].opcode = npeep[ns+1].opcode then begin
|
if npeep[ns].opcode = npeep[ns+1].opcode then
|
||||||
if npeep[ns].operand = npeep[ns+1].operand then begin
|
if npeep[ns].operand = npeep[ns+1].operand then
|
||||||
Remove(ns+1)
|
if npeep[ns].name = npeep[ns+1].name then
|
||||||
end; {if}
|
Remove(ns+1);
|
||||||
|
|
||||||
end; {if}
|
m_stz_dir, m_stz_dirX:
|
||||||
|
if npeep[ns].opcode = npeep[ns+1].opcode then
|
||||||
|
if npeep[ns].operand = npeep[ns+1].operand then
|
||||||
|
Remove(ns+1);
|
||||||
|
|
||||||
otherwise: ;
|
otherwise: ;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user