aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-10-12 09:07:33 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2016-10-12 09:07:33 +0200
commit4a8b97cb8af6e8632e1674ac82611b4d45c17b53 (patch)
tree0f4472b112485841833a6fc41665c3fd3b1003ee /gcc
parent83d3ca284984623383cb03d7d0b05d0865b3442c (diff)
downloadgcc-4a8b97cb8af6e8632e1674ac82611b4d45c17b53.zip
gcc-4a8b97cb8af6e8632e1674ac82611b4d45c17b53.tar.gz
gcc-4a8b97cb8af6e8632e1674ac82611b4d45c17b53.tar.bz2
re PR tree-optimization/77929 (ICE: verify_gimple failed (error: non-trivial conversion at assignment))
PR tree-optimization/77929 * tree-ssa-reassoc.c (optimize_range_tests_var_bound): Handle (*ops)[ranges[i].idx]->op != ranges[i].exp case. * gcc.c-torture/compile/pr77929.c: New test. From-SVN: r241019
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr77929.c13
-rw-r--r--gcc/tree-ssa-reassoc.c20
4 files changed, 39 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a3e7794..f64bc62 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-10-12 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/77929
+ * tree-ssa-reassoc.c (optimize_range_tests_var_bound): Handle
+ (*ops)[ranges[i].idx]->op != ranges[i].exp case.
+
2016-10-12 Aaron Sawdey <acsawdey@linux.vnet.ibm.com>
PR target/77934
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4423684..5605a3e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2016-10-12 Jakub Jelinek <jakub@redhat.com>
+ PR tree-optimization/77929
+ * gcc.c-torture/compile/pr77929.c: New test.
+
* c-c++-common/Wimplicit-fallthrough-25.c: New test.
* c-c++-common/Wimplicit-fallthrough-26.c: New test.
* c-c++-common/Wimplicit-fallthrough-27.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr77929.c b/gcc/testsuite/gcc.c-torture/compile/pr77929.c
new file mode 100644
index 0000000..bbcb04b
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr77929.c
@@ -0,0 +1,13 @@
+/* PR tree-optimization/77929 */
+
+void bar (void);
+
+void
+foo (int x, unsigned short int y)
+{
+ int a = 0;
+ int b = (y != 0) ? (x < y) : (a < 0);
+
+ if (x >= 0 & b)
+ bar ();
+}
diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c
index 7666365..7b844dd 100644
--- a/gcc/tree-ssa-reassoc.c
+++ b/gcc/tree-ssa-reassoc.c
@@ -2994,12 +2994,26 @@ optimize_range_tests_var_bound (enum tree_code opcode, int first, int length,
}
else
{
- g = gimple_build_assign (make_ssa_name (TREE_TYPE (ranges[i].exp)),
- ccode, rhs1, rhs2);
+ operand_entry *oe = (*ops)[ranges[i].idx];
+ tree ctype = oe->op ? TREE_TYPE (oe->op) : boolean_type_node;
+ if (!INTEGRAL_TYPE_P (ctype)
+ || (TREE_CODE (ctype) != BOOLEAN_TYPE
+ && TYPE_PRECISION (ctype) != 1))
+ ctype = boolean_type_node;
+ g = gimple_build_assign (make_ssa_name (ctype), ccode, rhs1, rhs2);
gimple_set_uid (g, uid);
gsi_insert_before (&gsi, g, GSI_SAME_STMT);
+ if (oe->op && ctype != TREE_TYPE (oe->op))
+ {
+ g = gimple_build_assign (make_ssa_name (TREE_TYPE (oe->op)),
+ NOP_EXPR, gimple_assign_lhs (g));
+ gimple_set_uid (g, uid);
+ gsi_insert_before (&gsi, g, GSI_SAME_STMT);
+ }
ranges[i].exp = gimple_assign_lhs (g);
- (*ops)[ranges[i].idx]->op = ranges[i].exp;
+ oe->op = ranges[i].exp;
+ ranges[i].low = build_zero_cst (TREE_TYPE (ranges[i].exp));
+ ranges[i].high = ranges[i].low;
}
ranges[i].strict_overflow_p = false;
operand_entry *oe = (*ops)[ranges[*idx].idx];