re PR middle-end/21985 (miscompiled or wrong code snippet?)
authorZdenek Dvorak <dvorakz@suse.cz>
Mon, 13 Jun 2005 14:59:40 +0000 (16:59 +0200)
committerZdenek Dvorak <rakdver@gcc.gnu.org>
Mon, 13 Jun 2005 14:59:40 +0000 (14:59 +0000)
PR middle-end/21985
* fold-const.c (split_address_to_core_and_offset): Always return
the address of the base object.

* gcc.dg/tree-ssa/pr21985.c: New test.

From-SVN: r100877

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

index 037a2050c09885064d02e9ea1f6d5a3363e926c3..f32577815f2ae582ab64a42dc76d250b962ed8ae 100644 (file)
@@ -1,3 +1,9 @@
+2005-06-13  Zdenek Dvorak  <dvorakz@suse.cz>
+
+       PR middle-end/21985
+       * fold-const.c (split_address_to_core_and_offset): Always return
+       the address of the base object.
+
 2005-06-13  Bernd Schmidt  <bernd.schmidt@analog.com>
 
        * doc/invoke.texi (Blackfin Options): Document -mlong-calls.
index af3f01c38df23b5a2b93a5dbd711cf43384d2ad2..2c1bd15b3654501dd34f7aaf777b3dde5231e53c 100644 (file)
@@ -11801,9 +11801,7 @@ split_address_to_core_and_offset (tree exp,
       core = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, pbitpos,
                                  poffset, &mode, &unsignedp, &volatilep,
                                  false);
-
-      if (TREE_CODE (core) == INDIRECT_REF)
-       core = TREE_OPERAND (core, 0);
+      core = build_fold_addr_expr (core);
     }
   else
     {
index 0baaf8a6e86688ffe649e437012165d9ede8bb6f..42536ea780e86f368877983cfe5fc1e74413a7ae 100644 (file)
@@ -1,3 +1,8 @@
+2005-06-13  Zdenek Dvorak  <dvorakz@suse.cz>
+
+       PR middle-end/21985
+       * gcc.dg/tree-ssa/pr21985.c: New test.
+
 2005-06-12  James A. Morrison  <phython@gcc.gnu.org>
 
        * ggcc.dg/pr14796-1.c: Add tests for (X << C) >> C.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21985.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21985.c
new file mode 100644 (file)
index 0000000..e940310
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-vars" } */
+
+struct
+{
+  struct
+    {
+      int a;
+      int b;
+    } a[100];
+} a;
+
+void foo(unsigned);
+unsigned *bar (void);
+
+int
+main (void)
+{
+  unsigned *b = bar ();
+
+  /* This should be folded.  */
+  foo (&a.a[50].a - &a.a[33].b);
+  foo ((unsigned) &a.a[50].b - (unsigned) &a);
+
+  /* And this should not.  */
+  foo ((unsigned) &b - (unsigned) b);
+  return 0;
+}
+
+/* Two of the calls to foo should be folded to just foo(constant).  */
+
+/* { dg-final { scan-tree-dump-times "foo \\(\[0-9\]*\\)" 2 "vars" } } */