diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 61203031e48..0d698b9948c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2008-11-03 Steve Ellcey + Jakub Jelinek + + * omp-low.c (expand_omp_for_generic): If iter_type has different + precision than type and type is a pointer type, cast n1 and n2 + first to an integer type with the same precision as pointers + and only afterwards to iter_type. + 2008-11-03 Richard Sandiford * config/arm/arm.md (UNSPEC_PIC_BASE): Update documentation. diff --git a/gcc/omp-low.c b/gcc/omp-low.c index 7d32f21781f..8781418bd82 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -3681,8 +3681,20 @@ expand_omp_for_generic (struct omp_region *region, t4 = build_fold_addr_expr (iend0); t3 = build_fold_addr_expr (istart0); t2 = fold_convert (fd->iter_type, fd->loop.step); - t1 = fold_convert (fd->iter_type, fd->loop.n2); - t0 = fold_convert (fd->iter_type, fd->loop.n1); + if (POINTER_TYPE_P (type) + && TYPE_PRECISION (type) != TYPE_PRECISION (fd->iter_type)) + { + /* Avoid casting pointers to integer of a different size. */ + tree itype + = lang_hooks.types.type_for_size (TYPE_PRECISION (type), 0); + t1 = fold_convert (fd->iter_type, fold_convert (itype, fd->loop.n2)); + t0 = fold_convert (fd->iter_type, fold_convert (itype, fd->loop.n1)); + } + else + { + t1 = fold_convert (fd->iter_type, fd->loop.n2); + t0 = fold_convert (fd->iter_type, fd->loop.n1); + } if (bias) { t1 = fold_build2 (PLUS_EXPR, fd->iter_type, t1, bias);