cseDef *cdp;
assert (sym);
- cdp = Safe_calloc (1, sizeof (cseDef));
+ cdp = Safe_alloc (sizeof (cseDef));
cdp->sym = sym;
cdp->diCode = ic;
*opp = IC_RESULT (cdp->diCode);
if ((*opp) &&
- (SPEC_USIGN(operandType (cop))==SPEC_USIGN(operandType (*opp))) &&
+ //(SPEC_USIGN(operandType (cop))==SPEC_USIGN(operandType (*opp))) &&
(SPEC_LONG(operandType (cop))==SPEC_LONG(operandType (*opp))))
{
}
break;
case CAST:
- /* if this is a cast of a literal value */
- if (IS_OP_LITERAL (IC_RIGHT (ic)))
- {
- ic->op = '=';
- IC_RIGHT (ic) =
- operandFromValue (valCastLiteral (operandType (IC_LEFT (ic)),
- operandLitValue (IC_RIGHT (ic))));
- IC_LEFT (ic) = NULL;
- SET_ISADDR (IC_RESULT (ic), 0);
- }
- /* if casting to the same */
- if (compareType (operandType (IC_RESULT (ic)),
- operandType (IC_RIGHT (ic))) == 1)
- {
- ic->op = '=';
- IC_LEFT (ic) = NULL;
- SET_ISADDR (IC_RESULT (ic), 0);
- }
- break;
+ {
+ sym_link *otype = operandType(IC_RIGHT(ic));
+ sym_link *ctype = operandType(IC_LEFT(ic));
+ /* if this is a cast of a literal value */
+ if (IS_OP_LITERAL (IC_RIGHT (ic)) &&
+ !(IS_GENPTR(ctype) && (IS_PTR(otype) && !IS_GENPTR(otype)))) {
+ ic->op = '=';
+ IC_RIGHT (ic) =
+ operandFromValue (valCastLiteral (operandType (IC_LEFT (ic)),
+ operandLitValue (IC_RIGHT (ic))));
+ IC_LEFT (ic) = NULL;
+ SET_ISADDR (IC_RESULT (ic), 0);
+ }
+ /* if casting to the same */
+ if (compareType (operandType (IC_RESULT (ic)),
+ operandType (IC_RIGHT (ic))) == 1) {
+ ic->op = '=';
+ IC_LEFT (ic) = NULL;
+ SET_ISADDR (IC_RESULT (ic), 0);
+ }
+ }
+ break;
case '!':
if (IS_OP_LITERAL (IC_LEFT (ic)))
{
/* special case for inductions */
if (induction &&
OP_SYMBOL(IC_RIGHT(ic))->isreqv &&
+ !OP_SYMBOL(IC_RESULT (ic))->noSpilLoc &&
!SPIL_LOC(IC_RESULT(ic))) {
SPIL_LOC (IC_RESULT (ic)) = SPIL_LOC (IC_RIGHT (ic));
}
/* too often, if it does happen then the user pays */
/* the price */
computeControlFlow (ebbs, count, 1);
- werror (W_CONTROL_FLOW, ic->filename, ic->lineno);
+ if (!options.lessPedantic) {
+ werror (W_CONTROL_FLOW, ic->filename, ic->lineno);
+ }
return;
}
remiCodeFromeBBlock (ebb, ic);
computeControlFlow (ebbs, count, 1);
- werror (W_CONTROL_FLOW, ic->filename, ic->lineno);
+ if (!options.lessPedantic) {
+ werror (W_CONTROL_FLOW, ic->filename, ic->lineno);
+ }
return;
}
{
sym_link *t1 = operandType (IC_LEFT (ic)), *t2;
- if (TARGET_IS_DS390)
+ /* if (TARGET_IS_DS390) */
+ if (options.model == MODEL_FLAT24)
{
/* hack-o-matic! */
return;
pdic = NULL;
}
+#if 0
/* if found then eliminate this and add to */
/* to cseSet an element containing result */
/* of this with previous opcode */
if (pdic)
{
-
if (IS_ITEMP (IC_RESULT (ic)))
{
-
+
/* replace in the remaining of this block */
replaceAllSymBySym (ic->next, IC_RESULT (ic), IC_RESULT (pdic), &ebb->ndompset);
/* remove this iCode from inexpressions of all
defic = ic;
}
+#else
+ /* Alternate code */
+ if (pdic && IS_ITEMP(IC_RESULT(ic))) {
+ /* if previous definition found change this to an assignment */
+ ic->op = '=';
+ IC_LEFT(ic) = NULL;
+ IC_RIGHT(ic) = operandFromOperand(IC_RESULT(pdic));
+ SET_ISADDR(IC_RESULT(ic),0);
+ SET_ISADDR(IC_RIGHT (ic),0);
+ }
+ if (!(POINTER_SET (ic)) && IC_RESULT (ic)) {
+ deleteItemIf (&cseSet, ifDefSymIsX, IC_RESULT (ic));
+ addSetHead (&cseSet, newCseDef (IC_RESULT (ic), ic));
+ }
+ defic = ic;
+#endif
/* if assignment to a parameter which is not
mine and type is a pointer then delete
pointerGets to take care of aliasing */