Commit bde84d51 by Richard Biener Committed by Richard Biener

re PR middle-end/85450 (ICE: invalid types in nop conversion during GIMPLE pass: ompexp)

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
parent e9230659
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> 2018-03-22 Hans-Peter Nilsson <hp@axis.com>
Jean Lee <xiaoyur347@gmail.com> Jean Lee <xiaoyur347@gmail.com>
......
...@@ -3501,7 +3501,12 @@ expand_omp_for_static_nochunk (struct omp_region *region, ...@@ -3501,7 +3501,12 @@ expand_omp_for_static_nochunk (struct omp_region *region,
t = fold_convert (itype, s0); t = fold_convert (itype, s0);
t = fold_build2 (MULT_EXPR, itype, t, step); t = fold_build2 (MULT_EXPR, itype, t, step);
if (POINTER_TYPE_P (type)) 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 else
t = fold_build2 (PLUS_EXPR, type, t, n1); t = fold_build2 (PLUS_EXPR, type, t, n1);
t = fold_convert (TREE_TYPE (startvar), t); t = fold_convert (TREE_TYPE (startvar), t);
...@@ -3515,7 +3520,12 @@ expand_omp_for_static_nochunk (struct omp_region *region, ...@@ -3515,7 +3520,12 @@ expand_omp_for_static_nochunk (struct omp_region *region,
t = fold_convert (itype, e0); t = fold_convert (itype, e0);
t = fold_build2 (MULT_EXPR, itype, t, step); t = fold_build2 (MULT_EXPR, itype, t, step);
if (POINTER_TYPE_P (type)) 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 else
t = fold_build2 (PLUS_EXPR, type, t, n1); t = fold_build2 (PLUS_EXPR, type, t, n1);
t = fold_convert (TREE_TYPE (startvar), t); t = fold_convert (TREE_TYPE (startvar), t);
...@@ -4000,7 +4010,12 @@ expand_omp_for_static_chunk (struct omp_region *region, ...@@ -4000,7 +4010,12 @@ expand_omp_for_static_chunk (struct omp_region *region,
t = fold_convert (itype, s0); t = fold_convert (itype, s0);
t = fold_build2 (MULT_EXPR, itype, t, step); t = fold_build2 (MULT_EXPR, itype, t, step);
if (POINTER_TYPE_P (type)) 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 else
t = fold_build2 (PLUS_EXPR, type, t, n1); t = fold_build2 (PLUS_EXPR, type, t, n1);
t = fold_convert (TREE_TYPE (startvar), t); t = fold_convert (TREE_TYPE (startvar), t);
...@@ -4014,7 +4029,12 @@ expand_omp_for_static_chunk (struct omp_region *region, ...@@ -4014,7 +4029,12 @@ expand_omp_for_static_chunk (struct omp_region *region,
t = fold_convert (itype, e0); t = fold_convert (itype, e0);
t = fold_build2 (MULT_EXPR, itype, t, step); t = fold_build2 (MULT_EXPR, itype, t, step);
if (POINTER_TYPE_P (type)) 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 else
t = fold_build2 (PLUS_EXPR, type, t, n1); t = fold_build2 (PLUS_EXPR, type, t, n1);
t = fold_convert (TREE_TYPE (startvar), t); t = fold_convert (TREE_TYPE (startvar), t);
......
...@@ -3842,7 +3842,7 @@ verify_gimple_assign_unary (gassign *stmt) ...@@ -3842,7 +3842,7 @@ verify_gimple_assign_unary (gassign *stmt)
|| (POINTER_TYPE_P (rhs1_type) || (POINTER_TYPE_P (rhs1_type)
&& INTEGRAL_TYPE_P (lhs_type) && INTEGRAL_TYPE_P (lhs_type)
&& (TYPE_PRECISION (rhs1_type) >= TYPE_PRECISION (lhs_type) && (TYPE_PRECISION (rhs1_type) >= TYPE_PRECISION (lhs_type)
|| ptrofftype_p (sizetype)))) || ptrofftype_p (lhs_type))))
return false; return false;
/* Allow conversion from integral to offset type and vice versa. */ /* Allow conversion from integral to offset type and vice versa. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment