OSDN Git Service

* gcc.dg/vect/vect.exp: Run tests with -funroll-loops for SPU in case
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-address.c
index b81135b..55d43a5 100644 (file)
@@ -1,11 +1,11 @@
 /* Memory address lowering and addressing mode selection.
-   Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2006, 2007 Free Software Foundation, Inc.
    
 This file is part of GCC.
    
 GCC is free software; you can redistribute it and/or modify it
 under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 2, or (at your option) any
+Free Software Foundation; either version 3, or (at your option) any
 later version.
    
 GCC is distributed in the hope that it will be useful, but WITHOUT
@@ -14,9 +14,8 @@ FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 for more details.
    
 You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING.  If not, write to the Free
-Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301, USA.  */
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
 
 /* Utility functions for manipulation with TARGET_MEM_REFs -- tree expressions
    that directly map to addressing modes of the target.  */
@@ -346,7 +345,8 @@ fixed_address_object_p (tree obj)
 {
   return (TREE_CODE (obj) == VAR_DECL
          && (TREE_STATIC (obj)
-             || DECL_EXTERNAL (obj)));
+             || DECL_EXTERNAL (obj))
+         && ! DECL_DLLIMPORT_P (obj));
 }
 
 /* If ADDR contains an address of object that is a link time constant,
@@ -423,9 +423,13 @@ add_to_parts (struct mem_address *parts, tree elt)
 
   /* Add ELT to base.  */
   type = TREE_TYPE (parts->base);
-  parts->base = fold_build2 (PLUS_EXPR, type,
-                            parts->base,
-                            fold_convert (type, elt));
+  if (POINTER_TYPE_P (type))
+    parts->base = fold_build2 (POINTER_PLUS_EXPR, type,
+                              parts->base,
+                              fold_convert (sizetype, elt));
+  else
+    parts->base = fold_build2 (PLUS_EXPR, type,
+                              parts->base, elt);
 }
 
 /* Finds the most expensive multiplication in ADDR that can be
@@ -640,9 +644,9 @@ create_mem_ref (block_stmt_iterator *bsi, tree type, aff_tree *addr)
        {
          atype = TREE_TYPE (parts.base);
          parts.base = force_gimple_operand_bsi (bsi,
-                       fold_build2 (PLUS_EXPR, atype,
+                       fold_build2 (POINTER_PLUS_EXPR, atype,
                                     parts.base,
-                                    fold_convert (atype, parts.index)),
+                                    parts.index),
                        true, NULL_TREE, true, BSI_SAME_STMT);
        }
       else