From 1bbc6693c956cbcda5983c21c8fab5d834e17b8f Mon Sep 17 00:00:00 2001
From: Xinliang David Li <davidxl@google.com>
Date: Sat, 12 Feb 2011 00:12:52 +0000
Subject: [PATCH] Fix PR47707

From-SVN: r170062
---
 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 25270c9a7626..99b24cb8fc33 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2011-02-11  Xinliang David Li  <davidxl@google.com>
+
+	PR tree-optimization/47707
+	* tree-chrec.c (convert_affine_scev): Keep type precision.
+
 2011-02-11  Eric Botcazou  <ebotcazou@adacore.com>
 
 	PR tree-optimization/47420
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 06a388e01d02..91cd4bb70d53 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-02-11  Xinliang David Li  <davidxl@google.com>
+
+	PR tree-optimization/47707
+	* g++.dg/tree-ssa/pr47707.C: New test.
+
 2011-02-11  Eric Botcazou  <ebotcazou@adacore.com>
 
 	* 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 000000000000..98852de17b88
--- /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 <assert.h>
+
+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 c721d43e33ec..1e49c1d5b214 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;
     }
 }
-
-- 
GitLab