+2007-10-13 Maarten Brock <sourceforge.brock AT dse.nl>
+
+ * src/mcs51/gen.c (leftRightUseAcc): use macro IS_OP_ACCUSE
+ * src/SDCCast.c (decorateType): optimize bit=cond?1:0, RFE 1738430
+ * support/regression/tests/bug-223113.c,
+ * support/regression/tests/bug-426632.c,
+ * support/regression/tests/bug-468811.c,
+ * support/regression/tests/bug-477835.c,
+ * support/regression/tests/bug-478094.c,
+ * support/regression/tests/bug-499644.c,
+ * support/regression/tests/bug-524209.c,
+ * support/regression/tests/bug-524211.c,
+ * support/regression/tests/packcast.c,
+ * support/regression/tests/structidx.c: added empty tests
+ * support/regression/tests/bug-607243.c: enabled test
+
2007-10-06 Borut Razem <borut.razem AT siol.net>
* .version, doc/sdccman.lyx: bumped version to 2.7.4 to indicate the full
/*-----------------------------------------------------------------*/
/* gatherAutoInit - creates assignment expressions for initial */
-/* values */
+/* values */
/*-----------------------------------------------------------------*/
static ast *
gatherAutoInit (symbol * autoChain)
upon tree->opval.op, if resultType can be propagated */
resultTypeProp = resultTypePropagate (tree, resultType);
- if (tree->opval.op == '?')
+ if ((tree->opval.op == '?') && (resultTypeProp != RESULT_TYPE_BIT))
dtl = decorateType (tree->left, RESULT_TYPE_IFX);
else
dtl = decorateType (tree->left, resultTypeProp);
{
if ((resultType == RESULT_TYPE_IFX) || (resultType == RESULT_TYPE_BIT))
{
- /* remove double '!!X' by 'X' */
+ /* replace double '!!X' by 'X' */
return tree->left->left;
}
/* remove double '!!X' by 'X ? 1 : 0' */
/* the type is value of the colon operator (on the right) */
assert (IS_COLON_OP (tree->right));
+ /* If already known then replace the tree : optimizer will do it
+ but faster to do it here. If done before decorating tree->right
+ this can save generating unused const strings. */
+ if (IS_LITERAL (LTYPE (tree)))
+ {
+ if (((int) ulFromVal (valFromType (LETYPE (tree)))) != 0)
+ return decorateType (tree->right->left, resultTypeProp);
+ else
+ return decorateType (tree->right->right, resultTypeProp);
+ }
+
+ tree->right = decorateType (tree->right, resultTypeProp);
+
if (IS_AST_LIT_VALUE (tree->right->left) && IS_AST_LIT_VALUE (tree->right->right))
{
double valTrue = AST_LIT_VALUE (tree->right->left);
((resultType == RESULT_TYPE_IFX) || (resultType == RESULT_TYPE_BIT)))
{
/* assign cond to result */
+ tree->left->decorated = 0;
return decorateType (tree->left, resultTypeProp);
}
else if ((valTrue == 0) && (valFalse == 1))
}
/* if they are equal then replace the tree */
- if (!astHasVolatile (tree->right) &&
- isAstEqual (tree->right->left, tree->right->right))
+ if (isAstEqual (tree->right->left, tree->right->right))
{
- return decorateType (tree->right->left, resultTypeProp);
+ return tree->right->left;
}
- /* if already known then replace the tree : optimizer will do it
- but faster to do it here */
- if (IS_LITERAL (LTYPE (tree)))
- {
- if (((int) ulFromVal (valFromType (LETYPE (tree)))) != 0)
- return decorateType (tree->right->left, resultTypeProp);
- else
- return decorateType (tree->right->right, resultTypeProp);
- }
- else
- {
- tree->right = decorateType (tree->right, resultTypeProp);
- TTYPE (tree) = RTYPE (tree);
- TETYPE (tree) = getSpec (TTYPE (tree));
- }
+ TTYPE (tree) = RTYPE (tree);
+ TETYPE (tree) = getSpec (TTYPE (tree));
return tree;
case ':':