aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2013-12-06 22:00:49 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2013-12-06 22:00:49 +0100
commit5f07cbdb0dec26dfe8b3138dbe9d4aa1d7959cd1 (patch)
tree2a2ba30b1649b37aeaba96d866e10ceb2cd88d90
parenta3698dfc4a6ef95db7db76ca81266ed2630071a1 (diff)
downloadgcc-5f07cbdb0dec26dfe8b3138dbe9d4aa1d7959cd1.zip
gcc-5f07cbdb0dec26dfe8b3138dbe9d4aa1d7959cd1.tar.gz
gcc-5f07cbdb0dec26dfe8b3138dbe9d4aa1d7959cd1.tar.bz2
re PR tree-optimization/59388 (ICE on valid code at -O1 and above on x86_64-linux-gnu)
PR tree-optimization/59388 * tree-ssa-reassoc.c (update_range_test): If op == range->exp, gimplify tem after stmt rather than before it. * gcc.c-torture/execute/pr59388.c: New test. From-SVN: r205761
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr59388.c11
-rw-r--r--gcc/tree-ssa-reassoc.c16
4 files changed, 33 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e965f96..cf50c90 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
2013-12-06 Jakub Jelinek <jakub@redhat.com>
+ PR tree-optimization/59388
+ * tree-ssa-reassoc.c (update_range_test): If op == range->exp,
+ gimplify tem after stmt rather than before it.
+
* tree-data-ref.c (struct data_ref_loc_d): Replace pos field with ref.
(get_references_in_stmt): Don't record operand addresses, but
operands themselves.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index eaa7a54..2d8d2eb 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2013-12-06 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/59388
+ * gcc.c-torture/execute/pr59388.c: New test.
+
2013-12-06 Dominique d'Humieres <dominiq@lps.ens.fr>
PR testsuite/59043
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr59388.c b/gcc/testsuite/gcc.c-torture/execute/pr59388.c
new file mode 100644
index 0000000..de3648a0
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr59388.c
@@ -0,0 +1,11 @@
+/* PR tree-optimization/59388 */
+
+int a;
+struct S { unsigned int f:1; } b;
+
+int
+main ()
+{
+ a = (0 < b.f) | b.f;
+ return a;
+}
diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c
index 7145559..ba6c3c7 100644
--- a/gcc/tree-ssa-reassoc.c
+++ b/gcc/tree-ssa-reassoc.c
@@ -2072,9 +2072,19 @@ update_range_test (struct range_entry *range, struct range_entry *otherrange,
tem = fold_convert_loc (loc, optype, tem);
gsi = gsi_for_stmt (stmt);
- tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE, true,
- GSI_SAME_STMT);
- for (gsi_prev (&gsi); !gsi_end_p (gsi); gsi_prev (&gsi))
+ /* In rare cases range->exp can be equal to lhs of stmt.
+ In that case we have to insert after the stmt rather then before
+ it. */
+ if (op == range->exp)
+ tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE, false,
+ GSI_CONTINUE_LINKING);
+ else
+ {
+ tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE, true,
+ GSI_SAME_STMT);
+ gsi_prev (&gsi);
+ }
+ for (; !gsi_end_p (gsi); gsi_prev (&gsi))
if (gimple_uid (gsi_stmt (gsi)))
break;
else