X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCcse.c;h=35a5df940f476513025bc343d0386ae13e69f198;hb=79d9f687503784b973f9174d7834ab6e7ad75801;hp=a2cc6ef0130079eafb106019b0a3caca65ba1ac0;hpb=411a4bf70f7e46852d1ff250a7512c504ea71810;p=fw%2Fsdcc diff --git a/src/SDCCcse.c b/src/SDCCcse.c index a2cc6ef0..35a5df94 100644 --- a/src/SDCCcse.c +++ b/src/SDCCcse.c @@ -144,11 +144,13 @@ pcseDef (void *item, va_list ap) void ReplaceOpWithCheaperOp(operand **op, operand *cop) { #ifdef RANGEHUNT - printf ("ReplaceOpWithCheaperOp %s with %s: ", - IS_SYMOP((*op)) ? OP_SYMBOL((*op))->name : "!SYM", - IS_SYMOP(cop) ? OP_SYMBOL(cop)->name : "!SYM"); + printf ("ReplaceOpWithCheaperOp\n\t"); + printOperand (*op, stdout); + printf ("\nwith\t"); + printOperand (cop, stdout); + // if op is a register equivalent - if (IS_ITEMP(cop) && OP_SYMBOL((*op))->isreqv) { + if (IS_ITEMP(cop) && IS_SYMOP((*op)) && OP_SYMBOL((*op))->isreqv) { operand **rop = &OP_SYMBOL((*op))->usl.spillLoc->reqv; if (isOperandEqual(*rop, *op)) { printf ("true"); @@ -415,6 +417,15 @@ DEFSETFUNC (findCheaperOp) (*opp)->isaddr = cop->isaddr; } + /* copy signedness to literal operands */ + if (IS_SPEC(operandType (cop)) && IS_SPEC(operandType (*opp)) + && isOperandLiteral(*opp) + && SPEC_NOUN(operandType(*opp)) == SPEC_NOUN(operandType(cop)) + && SPEC_USIGN(operandType(*opp)) != SPEC_USIGN(operandType(cop))) + { + SPEC_USIGN(operandType(*opp)) = SPEC_USIGN(operandType(cop)); + } + if (IS_SPEC(operandType (cop)) && IS_SPEC(operandType (*opp)) && SPEC_NOUN(operandType(cop)) != SPEC_NOUN(operandType(*opp))) {