diff options
author | Sebastian Pop <sebastian.pop@amd.com> | 2011-07-27 16:53:09 +0000 |
---|---|---|
committer | Sebastian Pop <spop@gcc.gnu.org> | 2011-07-27 16:53:09 +0000 |
commit | 3689198db0121443b06f1bbe4e1c34286acb3f32 (patch) | |
tree | e1b8b759d9b426b961abafcc38d68c6a098bae4d /gcc | |
parent | 27165eddf6cd08f66d24bfd7751675cfb84c6a6c (diff) | |
download | gcc-3689198db0121443b06f1bbe4e1c34286acb3f32.zip gcc-3689198db0121443b06f1bbe4e1c34286acb3f32.tar.gz gcc-3689198db0121443b06f1bbe4e1c34286acb3f32.tar.bz2 |
Fix PR49471: canonicalize_loop_ivs should not generate unsigned types.
2011-07-27 Sebastian Pop <sebastian.pop@amd.com>
PR tree-optimization/49471
* tree-ssa-loop-manip.c (canonicalize_loop_ivs): Build an unsigned
iv only when the largest type is unsigned. Do not call
lang_hooks.types.type_for_size.
* testsuite/libgomp.graphite/force-parallel-1.c: Un-xfail.
* testsuite/libgomp.graphite/force-parallel-2.c: Adjust pattern.
From-SVN: r176838
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-manip.c | 24 |
2 files changed, 28 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 46e8c0e..b07d494 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2011-07-27 Sebastian Pop <sebastian.pop@amd.com> + PR tree-optimization/49471 + * tree-ssa-loop-manip.c (canonicalize_loop_ivs): Build an unsigned + iv only when the largest type is unsigned. Do not call + lang_hooks.types.type_for_size. + +2011-07-27 Sebastian Pop <sebastian.pop@amd.com> + PR middle-end/45450 * graphite-poly.c (apply_poly_transforms): Disable legality check after an openscop read. diff --git a/gcc/tree-ssa-loop-manip.c b/gcc/tree-ssa-loop-manip.c index 8176ed8..0cec787 100644 --- a/gcc/tree-ssa-loop-manip.c +++ b/gcc/tree-ssa-loop-manip.c @@ -1200,18 +1200,36 @@ canonicalize_loop_ivs (struct loop *loop, tree *nit, bool bump_in_latch) gimple stmt; edge exit = single_dom_exit (loop); gimple_seq stmts; + enum machine_mode mode; + bool unsigned_p = false; for (psi = gsi_start_phis (loop->header); !gsi_end_p (psi); gsi_next (&psi)) { gimple phi = gsi_stmt (psi); tree res = PHI_RESULT (phi); + bool uns; - if (is_gimple_reg (res) && TYPE_PRECISION (TREE_TYPE (res)) > precision) - precision = TYPE_PRECISION (TREE_TYPE (res)); + type = TREE_TYPE (res); + if (!is_gimple_reg (res) + || (!INTEGRAL_TYPE_P (type) + && !POINTER_TYPE_P (type)) + || TYPE_PRECISION (type) < precision) + continue; + + uns = POINTER_TYPE_P (type) | TYPE_UNSIGNED (type); + + if (TYPE_PRECISION (type) > precision) + unsigned_p = uns; + else + unsigned_p |= uns; + + precision = TYPE_PRECISION (type); } - type = lang_hooks.types.type_for_size (precision, 1); + mode = smallest_mode_for_size (precision, MODE_INT); + precision = GET_MODE_PRECISION (mode); + type = build_nonstandard_integer_type (precision, unsigned_p); if (original_precision != precision) { |