summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordavidxl <davidxl@138bc75d-0d04-0410-961f-82ee72b054a4>2011-02-12 00:12:52 +0000
committerdavidxl <davidxl@138bc75d-0d04-0410-961f-82ee72b054a4>2011-02-12 00:12:52 +0000
commit0c2b2fc8735c7add06b0901942eec3cbb64fe26f (patch)
treea9b6229128c042546c7a0a161ca69a3f4c7b9ecd
parent892c141ef621e0ceb249dc28205da1b959398327 (diff)
downloadppe42-gcc-0c2b2fc8735c7add06b0901942eec3cbb64fe26f.tar.gz
ppe42-gcc-0c2b2fc8735c7add06b0901942eec3cbb64fe26f.zip
Fix PR47707
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@170062 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/pr47707.C29
-rw-r--r--gcc/tree-chrec.c8
4 files changed, 44 insertions, 3 deletions
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 <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 06a388e01d0..91cd4bb70d5 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 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 <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 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;
}
}
-
OpenPOWER on IntegriCloud