re PR tree-optimization/32810 (Not folding of const element for goto)
authorRichard Guenther <rguenther@suse.de>
Thu, 27 Mar 2008 16:32:28 +0000 (16:32 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 27 Mar 2008 16:32:28 +0000 (16:32 +0000)
2008-03-27  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/32810
* tree-ssa-ccp.c (get_symbol_constant_value): Strip useless
conversions from DECL_INITIAL.
(fold_const_aggregate_ref): Likewise from constructor elements.

* gcc.dg/tree-ssa/ssa-ccp-18.c: New testcase.

From-SVN: r133645

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-18.c [new file with mode: 0644]
gcc/tree-ssa-ccp.c

index 337716a73569f90135bd08397dd72f52ab8b7b3c..215f0b26728755b2a786a206119b4d03c3c1dae1 100644 (file)
@@ -1,3 +1,10 @@
+2008-03-27  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/32810
+       * tree-ssa-ccp.c (get_symbol_constant_value): Strip useless
+       conversions from DECL_INITIAL.
+       (fold_const_aggregate_ref): Likewise from constructor elements.
+
 2008-03-27  Zdenek Dvorak  <ook@ucw.cz>
 
        * tree-affine.h (aff_combination_expand): Declare.
index 42b5dcd80e93562ecdd87f3973c7e34234e06ac4..abaed69e399269f75234b99e9cef42a9656649a0 100644 (file)
@@ -1,3 +1,8 @@
+2008-03-27  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/32810
+       * gcc.dg/tree-ssa/ssa-ccp-18.c: New testcase.
+
 2008-03-27  Douglas Gregor  <doug.gregor@gmail.com>
 
        * g++.dg/cpp0x/variadic91.C: New.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-18.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-18.c
new file mode 100644 (file)
index 0000000..cbe1259
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-ccp1" } */
+
+/* Check that we constant propagate &&c into the goto and remove
+   the unreachable BBs.  */
+
+void a(int*);  void b(int*);  void c(int*);  void d(int*);
+void func2(int* val)
+{
+  const void *const labels[] = { &&a, &&b, &&c, &&d };
+  goto *labels[2];
+  a: a(val);
+  b: b(val);
+  c: c(val);
+  d: d(val);
+}
+
+/* { dg-final { scan-tree-dump-not "a \\\(" "ccp1" } } */
+/* { dg-final { scan-tree-dump-not "b \\\(" "ccp1" } } */
+/* { dg-final { cleanup-tree-dump "ccp1" } } */
index 8dcc759eb7d96dd4e3633dde5c6160fad40888df..9bba5053e60fa27ade004161caf83d86ca11bb4c 100644 (file)
@@ -278,9 +278,12 @@ get_symbol_constant_value (tree sym)
       && !MTAG_P (sym))
     {
       tree val = DECL_INITIAL (sym);
-      if (val
-         && is_gimple_min_invariant (val))
-       return val;
+      if (val)
+       {
+         STRIP_USELESS_TYPE_CONVERSION (val);
+         if (is_gimple_min_invariant (val))
+           return val;
+       }
       /* Variables declared 'const' without an initializer
         have zero as the intializer if they may not be
         overridden at link or run time.  */
@@ -1104,7 +1107,10 @@ fold_const_aggregate_ref (tree t)
       /* Whoo-hoo!  I'll fold ya baby.  Yeah!  */
       FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield, cval)
        if (tree_int_cst_equal (cfield, idx))
-         return cval;
+         {
+           STRIP_USELESS_TYPE_CONVERSION (cval);
+           return cval;
+         }
       break;
 
     case COMPONENT_REF:
@@ -1144,7 +1150,10 @@ fold_const_aggregate_ref (tree t)
        if (cfield == field
            /* FIXME: Handle bit-fields.  */
            && ! DECL_BIT_FIELD (cfield))
-         return cval;
+         {
+           STRIP_USELESS_TYPE_CONVERSION (cval);
+           return cval;
+         }
       break;
 
     case REALPART_EXPR: