re PR middle-end/47743 (PRE ICE in fold_convert_loc)
authorRichard Guenther <rguenther@suse.de>
Tue, 15 Feb 2011 13:04:47 +0000 (13:04 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 15 Feb 2011 13:04:47 +0000 (13:04 +0000)
2011-02-15  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/47743
* tree-ssa-pre.c (phi_translate_1): If we didn't get a value-number
for a non-type-compatible VN lookup bail out.

* gcc.dg/torture/pr47743.c: New testcase.

From-SVN: r170173

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr47743.c [new file with mode: 0644]
gcc/tree-ssa-pre.c

index 600f680217185577f85ae77c4b580a43e2b5d11a..c360d46c60fc0c4140f3c11be6e1f7d014a672db 100644 (file)
@@ -1,3 +1,9 @@
+2011-02-15  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/47743
+       * tree-ssa-pre.c (phi_translate_1): If we didn't get a value-number
+       for a non-type-compatible VN lookup bail out.
+
 2011-02-15  Nathan Froyd  <froydnj@codesourcery.com>
 
        * config/fr30/constraints.md: New file.
index 1c15f633825bed6656dc66f81b38d59e89c79c82..e60f6db4ccf0a4b0111f2e312ae1be6cf5976e02 100644 (file)
@@ -1,3 +1,8 @@
+2011-02-15  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/47743
+       * gcc.dg/torture/pr47743.c: New testcase.
+
 2011-02-15  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/47581
diff --git a/gcc/testsuite/gcc.dg/torture/pr47743.c b/gcc/testsuite/gcc.dg/torture/pr47743.c
new file mode 100644 (file)
index 0000000..1930e94
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+
+int
+foo (void *x, int y)
+{
+  long long a = 1, *b;
+  double *c;
+  if (y)
+    {
+      b = (long long *) x;
+      while (b)
+       a *= *b++;
+    }
+  else
+    {
+      c = (double *) x;
+      while (c)
+       a *= *c++;
+    }
+  return a;
+}
+
index 3056723e2ec07ce6a4ed29698f96b6bc8fae824d..f2466432f89fd120dcb2cec793149590deb07b21 100644 (file)
@@ -1691,6 +1691,12 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
                result = fold_build1 (VIEW_CONVERT_EXPR, ref->type, result);
                converted = true;
              }
+           else if (!result && newref
+                    && !useless_type_conversion_p (ref->type, newref->type))
+             {
+               VEC_free (vn_reference_op_s, heap, newoperands);
+               return NULL;
+             }
 
            if (result && is_gimple_min_invariant (result))
              {