aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSteve Ellcey <sje@cup.hp.com>2008-11-03 21:47:44 +0000
committerJakub Jelinek <jakub@gcc.gnu.org>2008-11-03 22:47:44 +0100
commitc6ff44935c8293728f660033a1d648caf9cd3770 (patch)
tree1d03e93415ed3811152d3b5d8fc4317b7d1913cc /gcc
parentf9bd1a89667c1e7a88ad4c92f25535c6e9540a6c (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/omp-low.c16
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);