tree-ssa.c (execute_update_address_taken): Handle TARGET_MEM_REF when processing...
authorAndrey Belevantsev <abel@ispras.ru>
Wed, 6 May 2009 14:27:10 +0000 (18:27 +0400)
committerAndrey Belevantsev <abel@gcc.gnu.org>
Wed, 6 May 2009 14:27:10 +0000 (18:27 +0400)
        * tree-ssa.c (execute_update_address_taken): Handle TARGET_MEM_REF
        when processing for not_regs_needed bitmap.
        * gimple.c (walk_stmt_load_store_addr_ops): When visiting address,
        handle TARGET_MEM_REF in lhs.  Check TMR_BASE for NULL while
        handling it for rhs.

From-SVN: r147179

gcc/ChangeLog
gcc/gimple.c
gcc/tree-ssa.c

index 059468610e0e8f5da0a056a7b90edde40b853569..3593d748295d681f0784cf71431de08b8d4166d9 100644 (file)
@@ -1,3 +1,11 @@
+2009-05-06  Andrey Belevantsev  <abel@ispras.ru>
+
+       * tree-ssa.c (execute_update_address_taken): Handle TARGET_MEM_REF
+       when processing for not_regs_needed bitmap.
+       * gimple.c (walk_stmt_load_store_addr_ops): When visiting address,
+       handle TARGET_MEM_REF in lhs.  Check TMR_BASE for NULL while 
+       handling it for rhs. 
+
 2009-05-06  H.J. Lu  <hongjiu.lu@intel.com>
 
        * config/i386/i386.md ((unnamed inc/dec peephole): Use
index 6ea1470df57881f64f5cc804b091321df46435cc..d81c3f35551b58a91759d94296b850badee4342b 100644 (file)
@@ -3232,12 +3232,18 @@ walk_stmt_load_store_addr_ops (gimple stmt, void *data,
          if (TREE_CODE (rhs) == ADDR_EXPR)
            ret |= visit_addr (stmt, TREE_OPERAND (rhs, 0), data);
          else if (TREE_CODE (rhs) == TARGET_MEM_REF
+                   && TMR_BASE (rhs) != NULL_TREE
                   && TREE_CODE (TMR_BASE (rhs)) == ADDR_EXPR)
            ret |= visit_addr (stmt, TREE_OPERAND (TMR_BASE (rhs), 0), data);
          else if (TREE_CODE (rhs) == OBJ_TYPE_REF
                   && TREE_CODE (OBJ_TYPE_REF_OBJECT (rhs)) == ADDR_EXPR)
            ret |= visit_addr (stmt, TREE_OPERAND (OBJ_TYPE_REF_OBJECT (rhs),
                                                   0), data);
+          lhs = gimple_assign_lhs (stmt);
+         if (TREE_CODE (lhs) == TARGET_MEM_REF
+              && TMR_BASE (lhs) != NULL_TREE
+              && TREE_CODE (TMR_BASE (lhs)) == ADDR_EXPR)
+            ret |= visit_addr (stmt, TREE_OPERAND (TMR_BASE (lhs), 0), data);
        }
       if (visit_load)
        {
index 10ec35bd2308c09646e0b6e4e979aa2c463c8510..10f84828fa8fc61c90e5c24ab20784ccc85a6bb1 100644 (file)
@@ -1518,14 +1518,20 @@ execute_update_addresses_taken (bool do_optimize)
             a local decl that requires not to be a gimple register.  */
          if (code == GIMPLE_ASSIGN || code == GIMPLE_CALL)
            {
-             tree lhs = gimple_get_lhs (stmt);
-             /* A plain decl does not need it set.  */
-             if (lhs && handled_component_p (lhs))
-               {
-                 var = get_base_address (lhs);
-                 if (DECL_P (var))
-                   bitmap_set_bit (not_reg_needs, DECL_UID (var));
-               }
+              tree lhs = gimple_get_lhs (stmt);
+              
+              /* We may not rewrite TMR_SYMBOL to SSA.  */
+              if (lhs && TREE_CODE (lhs) == TARGET_MEM_REF
+                  && TMR_SYMBOL (lhs))
+                bitmap_set_bit (not_reg_needs, DECL_UID (TMR_SYMBOL (lhs)));
+
+              /* A plain decl does not need it set.  */
+              else if (lhs && handled_component_p (lhs))
+                {
+                  var = get_base_address (lhs);
+                  if (DECL_P (var))
+                    bitmap_set_bit (not_reg_needs, DECL_UID (var));
+                }
            }
        }