re PR middle-end/85450 (ICE: invalid types in nop conversion during GIMPLE pass:...
authorRichard Biener <rguenther@suse.de>
Thu, 26 Apr 2018 07:21:42 +0000 (07:21 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 26 Apr 2018 07:21:42 +0000 (07:21 +0000)
2018-04-26  Richard Biener  <rguenther@suse.de>

PR middle-end/85450
* tree-cfg.c (verify_gimple_assign_unary): Restore proper
checking of integer<->pointer conversions.
* omp-expand.c (expand_omp_for_static_nochunk): Avoid
sign-/zero-extending pointer types.
(expand_omp_for_static_chunk): Likewise.

From-SVN: r259667

gcc/ChangeLog
gcc/omp-expand.c
gcc/tree-cfg.c

index dd88190..d3834b0 100644 (file)
@@ -1,3 +1,12 @@
+2018-04-26  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/85450
+       * tree-cfg.c (verify_gimple_assign_unary): Restore proper
+       checking of integer<->pointer conversions.
+       * omp-expand.c (expand_omp_for_static_nochunk): Avoid
+       sign-/zero-extending pointer types.
+       (expand_omp_for_static_chunk): Likewise.
+
 2018-03-22  Hans-Peter Nilsson  <hp@axis.com>
            Jean Lee  <xiaoyur347@gmail.com>
 
index c7d30ea..d2a77c0 100644 (file)
@@ -3501,7 +3501,12 @@ expand_omp_for_static_nochunk (struct omp_region *region,
   t = fold_convert (itype, s0);
   t = fold_build2 (MULT_EXPR, itype, t, step);
   if (POINTER_TYPE_P (type))
-    t = fold_build_pointer_plus (n1, t);
+    {
+      t = fold_build_pointer_plus (n1, t);
+      if (!POINTER_TYPE_P (TREE_TYPE (startvar))
+         && TYPE_PRECISION (TREE_TYPE (startvar)) > TYPE_PRECISION (type))
+       t = fold_convert (signed_type_for (type), t);
+    }
   else
     t = fold_build2 (PLUS_EXPR, type, t, n1);
   t = fold_convert (TREE_TYPE (startvar), t);
@@ -3515,7 +3520,12 @@ expand_omp_for_static_nochunk (struct omp_region *region,
   t = fold_convert (itype, e0);
   t = fold_build2 (MULT_EXPR, itype, t, step);
   if (POINTER_TYPE_P (type))
-    t = fold_build_pointer_plus (n1, t);
+    {
+      t = fold_build_pointer_plus (n1, t);
+      if (!POINTER_TYPE_P (TREE_TYPE (startvar))
+         && TYPE_PRECISION (TREE_TYPE (startvar)) > TYPE_PRECISION (type))
+       t = fold_convert (signed_type_for (type), t);
+    }
   else
     t = fold_build2 (PLUS_EXPR, type, t, n1);
   t = fold_convert (TREE_TYPE (startvar), t);
@@ -4000,7 +4010,12 @@ expand_omp_for_static_chunk (struct omp_region *region,
   t = fold_convert (itype, s0);
   t = fold_build2 (MULT_EXPR, itype, t, step);
   if (POINTER_TYPE_P (type))
-    t = fold_build_pointer_plus (n1, t);
+    {
+      t = fold_build_pointer_plus (n1, t);
+      if (!POINTER_TYPE_P (TREE_TYPE (startvar))
+         && TYPE_PRECISION (TREE_TYPE (startvar)) > TYPE_PRECISION (type))
+       t = fold_convert (signed_type_for (type), t);
+    }
   else
     t = fold_build2 (PLUS_EXPR, type, t, n1);
   t = fold_convert (TREE_TYPE (startvar), t);
@@ -4014,7 +4029,12 @@ expand_omp_for_static_chunk (struct omp_region *region,
   t = fold_convert (itype, e0);
   t = fold_build2 (MULT_EXPR, itype, t, step);
   if (POINTER_TYPE_P (type))
-    t = fold_build_pointer_plus (n1, t);
+    {
+      t = fold_build_pointer_plus (n1, t);
+      if (!POINTER_TYPE_P (TREE_TYPE (startvar))
+         && TYPE_PRECISION (TREE_TYPE (startvar)) > TYPE_PRECISION (type))
+       t = fold_convert (signed_type_for (type), t);
+    }
   else
     t = fold_build2 (PLUS_EXPR, type, t, n1);
   t = fold_convert (TREE_TYPE (startvar), t);
index 9485f73..c4767a3 100644 (file)
@@ -3842,7 +3842,7 @@ verify_gimple_assign_unary (gassign *stmt)
            || (POINTER_TYPE_P (rhs1_type)
                && INTEGRAL_TYPE_P (lhs_type)
                && (TYPE_PRECISION (rhs1_type) >= TYPE_PRECISION (lhs_type)
-                   || ptrofftype_p (sizetype))))
+                   || ptrofftype_p (lhs_type))))
          return false;
 
        /* Allow conversion from integral to offset type and vice versa.  */