Bug in sibling call code
Richard Kenner
kenner@vlsi1.ultra.nyu.edu
Wed Apr 12 06:12:00 GMT 2000
If an argument is a CONSTRUCTOR, we don't properly check for safely or
unsave since TREE_LIST isn't handled proper.
Wed Apr 12 08:47:38 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* tree.c (unsave_expr_now_r, unsafe_for_reeval): Properly do TREE_LIST.
*** tree.c 2000/04/08 04:45:18 1.136
--- tree.c 2000/04/12 12:19:36
*************** unsave_expr_now_r (expr)
*** 2650,2674 ****
code = TREE_CODE (expr);
- if (code == CALL_EXPR
- && TREE_OPERAND (expr, 1)
- && TREE_CODE (TREE_OPERAND (expr, 1)) == TREE_LIST)
- {
- tree exp = TREE_OPERAND (expr, 1);
- while (exp)
- {
- unsave_expr_now_r (TREE_VALUE (exp));
- exp = TREE_CHAIN (exp);
- }
- }
-
switch (TREE_CODE_CLASS (code))
{
case 'c': /* a constant */
case 't': /* a type node */
- case 'x': /* something random, like an identifier or an ERROR_MARK. */
case 'd': /* A decl node */
case 'b': /* A block node */
break;
case 'e': /* an expression */
case 'r': /* a reference */
--- 2650,2669 ----
code = TREE_CODE (expr);
switch (TREE_CODE_CLASS (code))
{
case 'c': /* a constant */
case 't': /* a type node */
case 'd': /* A decl node */
case 'b': /* A block node */
break;
+ case 'x': /* miscellaneous: e.g., identifier, TREE_LIST or ERROR_MARK. */
+ if (code == TREE_LIST)
+ {
+ unsave_expr_now_r (TREE_VALUE (expr));
+ unsave_expr_now_r (TREE_CHAIN (expr));
+ }
+ break;
+
case 'e': /* an expression */
case 'r': /* a reference */
*************** unsafe_for_reeval (expr)
*** 2725,2730 ****
tree expr;
{
enum tree_code code;
! register int i, tmp, unsafeness;
int first_rtl;
--- 2720,2727 ----
tree expr;
{
+ int unsafeness = 0;
enum tree_code code;
! int i, tmp;
! tree exp;
int first_rtl;
*************** unsafe_for_reeval (expr)
*** 2734,2738 ****
code = TREE_CODE (expr);
first_rtl = first_rtl_op (code);
- unsafeness = 0;
switch (code)
--- 2731,2734 ----
*************** unsafe_for_reeval (expr)
*** 2742,2760 ****
return 2;
! case CALL_EXPR:
! if (TREE_OPERAND (expr, 1)
! && TREE_CODE (TREE_OPERAND (expr, 1)) == TREE_LIST)
{
! tree exp = TREE_OPERAND (expr, 1);
! while (exp)
! {
! tmp = unsafe_for_reeval (TREE_VALUE (exp));
! if (tmp > 1)
! return tmp;
! exp = TREE_CHAIN (exp);
! }
}
- return 1;
case TARGET_EXPR:
unsafeness = 1;
--- 2738,2754 ----
return 2;
! case TREE_LIST:
! for (exp = expr; exp != 0; exp = TREE_CHAIN (exp))
{
! tmp = unsafe_for_reeval (TREE_VALUE (exp));
! unsafeness = MAX (tmp, unsafeness);
}
+ return unsafeness;
+
+ case CALL_EXPR:
+ tmp = unsafe_for_reeval (TREE_OPERAND (expr, 1));
+ return MAX (tmp, 1);
+
case TARGET_EXPR:
unsafeness = 1;
*************** unsafe_for_reeval (expr)
*** 2784,2790 ****
{
tmp = unsafe_for_reeval (TREE_OPERAND (expr, i));
! if (tmp > unsafeness)
! unsafeness = tmp;
}
return unsafeness;
--- 2778,2784 ----
{
tmp = unsafe_for_reeval (TREE_OPERAND (expr, i));
! unsafeness = MAX (tmp, unsafeness);
}
+
return unsafeness;
More information about the Gcc-patches
mailing list