diff options
author | Steve Ellcey <sje@cup.hp.com> | 2008-11-03 21:47:44 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2008-11-03 22:47:44 +0100 |
commit | c6ff44935c8293728f660033a1d648caf9cd3770 (patch) | |
tree | 1d03e93415ed3811152d3b5d8fc4317b7d1913cc | |
parent | f9bd1a89667c1e7a88ad4c92f25535c6e9540a6c (diff) | |
download | gcc-c6ff44935c8293728f660033a1d648caf9cd3770.zip gcc-c6ff44935c8293728f660033a1d648caf9cd3770.tar.gz gcc-c6ff44935c8293728f660033a1d648caf9cd3770.tar.bz2 |
omp-low.c (expand_omp_for_generic): If iter_type has different precision than type and type is a pointer type...
* 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.
Co-Authored-By: Jakub Jelinek <jakub@redhat.com>
From-SVN: r141563
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/omp-low.c | 16 |
2 files changed, 22 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6120303..0d698b9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2008-11-03 Steve Ellcey <sje@cup.hp.com> + Jakub Jelinek <jakub@redhat.com> + + * 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 <rdsandiford@googlemail.com> * config/arm/arm.md (UNSPEC_PIC_BASE): Update documentation. diff --git a/gcc/omp-low.c b/gcc/omp-low.c index 7d32f21..8781418 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); |