From 0c2b2fc8735c7add06b0901942eec3cbb64fe26f Mon Sep 17 00:00:00 2001 From: davidxl Date: Sat, 12 Feb 2011 00:12:52 +0000 Subject: [PATCH] Fix PR47707 git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@170062 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 +++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/tree-ssa/pr47707.C | 29 +++++++++++++++++++++++++++++ gcc/tree-chrec.c | 8 +++++--- 4 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr47707.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 25270c9a762..99b24cb8fc3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2011-02-11 Xinliang David Li + + PR tree-optimization/47707 + * tree-chrec.c (convert_affine_scev): Keep type precision. + 2011-02-11 Eric Botcazou PR tree-optimization/47420 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 06a388e01d0..91cd4bb70d5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-02-11 Xinliang David Li + + PR tree-optimization/47707 + * g++.dg/tree-ssa/pr47707.C: New test. + 2011-02-11 Eric Botcazou * g++.dg/opt/inline17.C: New test. diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr47707.C b/gcc/testsuite/g++.dg/tree-ssa/pr47707.C new file mode 100644 index 00000000000..98852de17b8 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr47707.C @@ -0,0 +1,29 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fno-tree-vrp" } */ +#include + +struct CH +{ + unsigned char ch : 3; +} ch; + +__attribute__((noinline)) void MakeCheckOp (unsigned int *v1, unsigned int *v2) +{ + assert (*v1 == *v2); + +} + +int main (void) +{ + + int len; + + for (len = 4; len >= 1; len--) + { + unsigned v1, v2; + ch.ch = len; + v1 = ch.ch; + v2 = len; + MakeCheckOp (&v1, &v2); + } +} diff --git a/gcc/tree-chrec.c b/gcc/tree-chrec.c index c721d43e33e..1e49c1d5b21 100644 --- a/gcc/tree-chrec.c +++ b/gcc/tree-chrec.c @@ -1238,8 +1238,11 @@ convert_affine_scev (struct loop *loop, tree type, performed by default when CT is signed. */ new_step = *step; if (TYPE_PRECISION (step_type) > TYPE_PRECISION (ct) && TYPE_UNSIGNED (ct)) - new_step = chrec_convert_1 (signed_type_for (ct), new_step, at_stmt, - use_overflow_semantics); + { + tree signed_ct = build_nonstandard_integer_type (TYPE_PRECISION (ct), 0); + new_step = chrec_convert_1 (signed_ct, new_step, at_stmt, + use_overflow_semantics); + } new_step = chrec_convert_1 (step_type, new_step, at_stmt, use_overflow_semantics); if (automatically_generated_chrec_p (new_base) @@ -1579,4 +1582,3 @@ evolution_function_right_is_integer_cst (const_tree chrec) return false; } } - -- 2.11.4.GIT