1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-07 07:29:33 +00:00

Merge pull request #1992 from bbbradsmith/optstackops_toscmpbool_fix

OptStackOps label migration fix
This commit is contained in:
Bob Andrews 2023-02-24 13:43:07 +01:00 committed by GitHub
commit 221e6b53ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 44 additions and 0 deletions

View File

@ -1153,6 +1153,8 @@ static unsigned Opt_a_toscmpbool (StackOpData* D, const char* BoolTransformer)
/* Save lhs into zeropage */
AddStoreLhsA (D);
/* AddStoreLhsA may have moved the OpIndex, recalculate insertion point to prevent label migration. */
D->IP = D->OpIndex + 1;
/* cmp */
X = NewCodeEntry (OP65_CMP, AM65_ZP, D->ZPLo, 0, D->OpEntry->LI);
@ -1206,6 +1208,8 @@ static unsigned Opt_a_tosicmp (StackOpData* D)
/* RHS src is not directly comparable */
X = NewCodeEntry (OP65_STA, AM65_ZP, D->ZPHi, 0, D->OpEntry->LI);
InsertEntry (D, X, D->Rhs.A.ChgIndex + 1);
/* RHS insertion may have moved the OpIndex, recalculate insertion point to prevent label migration. */
D->IP = D->OpIndex + 1;
/* Cmp with stored RHS */
X = NewCodeEntry (OP65_CMP, AM65_ZP, D->ZPHi, 0, D->OpEntry->LI);

40
test/val/bug1989.c Normal file
View File

@ -0,0 +1,40 @@
/* bug #1989 - OptStackOps Opt_a_toscmpbool bypassed a comparison, discovered in 544a49c */
#include <stdlib.h>
unsigned char i,r,j;
void fail() // for the r=0 case, the == comparison was getting jumped over by OptStackOps
{
if ((i & 0x1f) == (r ? 0 : 16)) j -=8;
}
void pass()
{
if ((i & 0x1f) == (unsigned char)(r ? 0 : 16)) j -= 8;
}
void test(unsigned char ti, unsigned char tr, unsigned char tj)
{
unsigned char rj;
i = ti;
r = tr;
j = tj;
pass();
rj = j;
i = ti;
r = tr;
j = tj;
fail();
if (j != rj) exit(1);
}
int main(void)
{
test( 1,0,33);
test( 0,0,33);
test( 1,1,33);
test(16,1,33);
return 0;
}