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