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
This commit is contained in:
Richard Biener 2018-04-26 07:21:42 +00:00 committed by Richard Biener
parent e92306590e
commit bde84d5120
3 changed files with 34 additions and 5 deletions

View 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>

View 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);

View 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. */