]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/66233 (internal compiler error: in expand_fix, at optabs...
authorJakub Jelinek <jakub@redhat.com>
Thu, 18 Jun 2015 14:06:04 +0000 (16:06 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 18 Jun 2015 14:06:04 +0000 (16:06 +0200)
PR tree-optimization/66233
* fold-const.c (fold_unary_loc): Don't handle vector types.
Simplify.
* tree-ssa-forwprop.c (combine_conversions): Likewise.

* gcc.c-torture/execute/pr66233.c: New test.

From-SVN: r224611

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr66233.c [new file with mode: 0644]
gcc/tree-ssa-forwprop.c

index 263a8cec8b8a23927e703ca96727bc542614ebbf..4ee4479e2278f884e6ce9076293e4961af2c0a8d 100644 (file)
@@ -1,3 +1,10 @@
+2015-06-18  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/66233
+       * fold-const.c (fold_unary_loc): Don't handle vector types.
+       Simplify.
+       * tree-ssa-forwprop.c (combine_conversions): Likewise.
+
 2015-06-16  Richard Biener  <rguenther@suse.de>
 
        Revert
index 117153175b61890627fbe35fb952adfbd9807082..f06bef61573604a17006e75cb0449c125adc5359 100644 (file)
@@ -7935,16 +7935,12 @@ fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0)
             (for integers).  Avoid this if the final type is a pointer since
             then we sometimes need the middle conversion.  Likewise if the
             final type has a precision not equal to the size of its mode.  */
-         if (((inter_int && inside_int)
-              || (inter_float && inside_float)
-              || (inter_vec && inside_vec))
+         if (((inter_int && inside_int) || (inter_float && inside_float))
+             && (final_int || final_float)
              && inter_prec >= inside_prec
-             && (inter_float || inter_vec
-                 || inter_unsignedp == inside_unsignedp)
+             && (inter_float || inter_unsignedp == inside_unsignedp)
              && ! (final_prec != GET_MODE_PRECISION (TYPE_MODE (type))
-                   && TYPE_MODE (type) == TYPE_MODE (inter_type))
-             && ! final_ptr
-             && (! final_vec || inter_prec == inside_prec))
+                   && TYPE_MODE (type) == TYPE_MODE (inter_type)))
            return fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 0));
 
          /* If we have a sign-extension of a zero-extended value, we can
index 6807d7683405b59a558477e43794658d42dfb713..6331bcbdaeafbac6da1b98a424a3c3cc56259e8a 100644 (file)
@@ -1,3 +1,8 @@
+2015-06-18  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/66233
+       * gcc.c-torture/execute/pr66233.c: New test.
+
 2015-06-12  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/63608
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr66233.c b/gcc/testsuite/gcc.c-torture/execute/pr66233.c
new file mode 100644 (file)
index 0000000..b0d63b6
--- /dev/null
@@ -0,0 +1,22 @@
+/* PR tree-optimization/66233 */
+
+unsigned int v[8];
+
+__attribute__((noinline, noclone)) void
+foo (void)
+{
+  int i;
+  for (i = 0; i < 8; i++)
+    v[i] = (float) i;
+}
+
+int
+main ()
+{
+  unsigned int i;
+  foo ();
+  for (i = 0; i < 8; i++)
+    if (v[i] != i)
+      __builtin_abort ();
+  return 0;
+}
index d617f5b625d443368f64b6650669bb7bc59da0e4..14e01a81d3dcf293721e3cba1587feb7e855b652 100644 (file)
@@ -2474,16 +2474,12 @@ combine_conversions (gimple_stmt_iterator *gsi)
         (for integers).  Avoid this if the final type is a pointer since
         then we sometimes need the middle conversion.  Likewise if the
         final type has a precision not equal to the size of its mode.  */
-      if (((inter_int && inside_int)
-          || (inter_float && inside_float)
-          || (inter_vec && inside_vec))
+      if (((inter_int && inside_int) || (inter_float && inside_float))
+         && (final_int || final_float)
          && inter_prec >= inside_prec
-         && (inter_float || inter_vec
-             || inter_unsignedp == inside_unsignedp)
+         && (inter_float || inter_unsignedp == inside_unsignedp)
          && ! (final_prec != GET_MODE_PRECISION (TYPE_MODE (type))
-               && TYPE_MODE (type) == TYPE_MODE (inter_type))
-         && ! final_ptr
-         && (! final_vec || inter_prec == inside_prec))
+               && TYPE_MODE (type) == TYPE_MODE (inter_type)))
        {
          gimple_assign_set_rhs1 (stmt, defop0);
          update_stmt (stmt);