aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2014-12-06 13:10:31 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2014-12-06 13:10:31 +0000
commit7fb66c15276446a48da02af39fb5d3e363ef8e32 (patch)
tree14338b4c19e81b2d5f62b0e78a9d232cce2e975b
parentc7c816408314bd7e971543bfa91250d464e45540 (diff)
downloadgcc-7fb66c15276446a48da02af39fb5d3e363ef8e32.zip
gcc-7fb66c15276446a48da02af39fb5d3e363ef8e32.tar.gz
gcc-7fb66c15276446a48da02af39fb5d3e363ef8e32.tar.bz2
re PR tree-optimization/64183 (Complete unroll doesn't happen for a while-loop)
PR tree-optimization/64183 * c-gimplify.c (c_gimplify_expr): Don't convert the RHS of a shift-expression if it is integer_type_node. Use types_compatible_p. * gcc.dg/tree-ssa/pr64183.c: New test. From-SVN: r218447
-rw-r--r--gcc/c-family/ChangeLog6
-rw-r--r--gcc/c-family/c-gimplify.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr64183.c21
4 files changed, 36 insertions, 1 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index ca3e0b3..1cb8968 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,9 @@
+2014-12-06 Marek Polacek <polacek@redhat.com>
+
+ PR tree-optimization/64183
+ * c-gimplify.c (c_gimplify_expr): Don't convert the RHS of a
+ shift-expression if it is integer_type_node. Use types_compatible_p.
+
2014-11-29 Jakub Jelinek <jakub@redhat.com>
* c-common.c (convert_vector_to_pointer_for_subscript): Remove NULL
diff --git a/gcc/c-family/c-gimplify.c b/gcc/c-family/c-gimplify.c
index 2cfa5d9..4781cf2 100644
--- a/gcc/c-family/c-gimplify.c
+++ b/gcc/c-family/c-gimplify.c
@@ -255,7 +255,10 @@ c_gimplify_expr (tree *expr_p, gimple_seq *pre_p ATTRIBUTE_UNUSED,
type demotion/promotion pass. */
tree *op1_p = &TREE_OPERAND (*expr_p, 1);
if (TREE_CODE (TREE_TYPE (*op1_p)) != VECTOR_TYPE
- && TYPE_MAIN_VARIANT (TREE_TYPE (*op1_p)) != unsigned_type_node)
+ && !types_compatible_p (TYPE_MAIN_VARIANT (TREE_TYPE (*op1_p)),
+ unsigned_type_node)
+ && !types_compatible_p (TYPE_MAIN_VARIANT (TREE_TYPE (*op1_p)),
+ integer_type_node))
*op1_p = convert (unsigned_type_node, *op1_p);
break;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4ea2dfe..abeacd0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-12-06 Marek Polacek <polacek@redhat.com>
+
+ PR tree-optimization/64183
+ * gcc.dg/tree-ssa/pr64183.c: New test.
+
2014-12-06 H.J. Lu <hongjiu.lu@intel.com>
PR target/64200
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr64183.c b/gcc/testsuite/gcc.dg/tree-ssa/pr64183.c
new file mode 100644
index 0000000..0563739
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr64183.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-tree-cunroll-details" } */
+
+int bits;
+unsigned int size;
+int max_code;
+
+void
+test ()
+{
+ int code = 0;
+
+ while (code < max_code)
+ code |= ((unsigned int) (size >> (--bits)));
+
+ while (bits < (unsigned int)25)
+ bits += 8;
+}
+
+/* { dg-final { scan-tree-dump "Loop 2 iterates at most 4 times" "cunroll"} } */
+/* { dg-final { cleanup-tree-dump "cunroll" } } */