tree.h (maybe_fold_offset_to_component_ref): Declare.
authorJan Hubicka <jh@suse.cz>
Sun, 8 Apr 2007 22:12:21 +0000 (00:12 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sun, 8 Apr 2007 22:12:21 +0000 (22:12 +0000)
* tree.h (maybe_fold_offset_to_component_ref): Declare.
* tree-ssa-ccp.c (maybe_fold_offset_to_component_ref): Export.
* fold-const.c (fold_unary): Use it.

* gcc.dg/tree-ssa/foldaddr-2.c: New file.

From-SVN: r123664

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/foldaddr-2.c [new file with mode: 0644]
gcc/tree-ssa-ccp.c
gcc/tree.h

index 16cdc68d8994cb9d3dcec14d58452e2d4561b64c..6542dc838823b85e8c508241d79fe7801d5d7ee0 100644 (file)
@@ -1,3 +1,9 @@
+2007-04-08  Jan Hubicka  <jh@suse.cz>
+
+       * tree.h (maybe_fold_offset_to_component_ref): Declare.
+       * tree-ssa-ccp.c (maybe_fold_offset_to_component_ref): Export.
+       * fold-const.c (fold_unary): Use it.
+
 2007-04-08  Andrew Pinski  <andrew_pinski@playstation.sony.com>
 
        * varasm.c (assemble_variable): Remove call to
index a8b6f349d95f3acd83970b3eac959a938fb8e6ae..ceaa4464f5bcc420724d439ea239895c5c9ca012 100644 (file)
@@ -7735,6 +7735,13 @@ fold_unary (enum tree_code code, tree type, tree op0)
            return fold_convert (type, build_fold_addr_expr (base));
         }
 
+      /* Convert (type *)&A into &A->field_of_type_and_offset_0.  */
+      if (TREE_CODE (op0) == ADDR_EXPR && POINTER_TYPE_P (type)
+         && (tem = maybe_fold_offset_to_component_ref
+                     (TREE_TYPE (TREE_OPERAND (op0, 0)), TREE_OPERAND (op0, 0),
+                      integer_zero_node, TREE_TYPE (type), false)))
+        return build_fold_addr_expr_with_type (tem, type);
+
       if ((TREE_CODE (op0) == MODIFY_EXPR
           || TREE_CODE (op0) == GIMPLE_MODIFY_STMT)
          && TREE_CONSTANT (GENERIC_TREE_OPERAND (op0, 1))
index ace71ca69335ebdc5373ed3f1849e18d7fad3ce6..64c6cf6432728744e2beebf46a8291bda226dc57 100644 (file)
@@ -1,3 +1,7 @@
+2007-04-08  Jan Hubicka  <jh@suse.cz>
+
+       * gcc.dg/tree-ssa/foldaddr-2.c: New file.
+
 2007-04-07  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/31257
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/foldaddr-2.c b/gcc/testsuite/gcc.dg/tree-ssa/foldaddr-2.c
new file mode 100644 (file)
index 0000000..dc764c3
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+struct a{
+       int a;
+       int b;
+} a;
+int *
+t()
+{
+       return (int *)&a;
+}
+/* { dg-final { scan-tree-dump "a.a" "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
index b5adbd9c8d20c6610fadfa9ed58f948888ed2ad2..ebf2708c18aeaccc07c3e7f7453e1b988963d3c4 100644 (file)
@@ -1643,7 +1643,7 @@ maybe_fold_offset_to_array_ref (tree base, tree offset, tree orig_type)
    is the desired result type.  */
 /* ??? This doesn't handle class inheritance.  */
 
-static tree
+tree
 maybe_fold_offset_to_component_ref (tree record_type, tree base, tree offset,
                                    tree orig_type, bool base_is_ptr)
 {
index 64efe7c60fe1d855791cbddb4b13720cbf4646c4..3ebf27fddc53dd138df024270ac3d24c9cc49a30 100644 (file)
@@ -4412,6 +4412,8 @@ extern void fold_defer_overflow_warnings (void);
 extern void fold_undefer_overflow_warnings (bool, tree, int);
 extern void fold_undefer_and_ignore_overflow_warnings (void);
 extern bool fold_deferring_overflow_warnings_p (void);
+extern tree maybe_fold_offset_to_component_ref (tree, tree, tree,
+                                               tree, bool);
 
 extern tree force_fit_type_double (tree, unsigned HOST_WIDE_INT, HOST_WIDE_INT,
                                   int, bool);