summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>2007-10-28 14:57:50 +0000
committeruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>2007-10-28 14:57:50 +0000
commit63a1777b8588e0da96c72a2096c4fda7e9cf7bca (patch)
tree67b12a9a6f98f99e2f991cab8fa948036244dbdc
parenteb22060034f26830d5303e8f7d08ac0310e948a4 (diff)
downloadgcc-63a1777b8588e0da96c72a2096c4fda7e9cf7bca.tar.gz
PR tree-optimization/33920
* tree-if-conv.c (tree_if_conversion): Force predicate of single successor bb to true when predecessor bb has NULL predicate. (find_phi_replacement_condition): Assert that tmp_cond is non-null. testsuite/ChangeLog: PR tree-optimization/33920 * gcc.dg/tree-ssa/pr33290.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@129696 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr33920.c51
-rw-r--r--gcc/tree-if-conv.c12
4 files changed, 74 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9e772d65055..7ec6c5710e3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2007-10-28 Uros Bizjak <ubizjak@gmail.com>
+
+ PR tree-optimization/33920
+ * tree-if-conv.c (tree_if_conversion): Force predicate of single
+ successor bb to true when predecessor bb has NULL predicate.
+ (find_phi_replacement_condition): Assert that tmp_cond is non-null.
+
2007-10-28 Richard Sandiford <rsandifo@nildram.co.uk>
* config/mips/mips.md: Add combiner patterns for DImode extensions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d47b1087a99..2988c0c378d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2007-10-28 Martin Michlmayr <tbm@cyrius.com>
+ Uros Bizjak <ubizjak@gmail.com>
+
+ PR tree-optimization/33920
+ * gcc.dg/tree-ssa/pr33290.c: New test.
+
2007-10-27 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/31306
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr33920.c b/gcc/testsuite/gcc.dg/tree-ssa/pr33920.c
new file mode 100644
index 00000000000..1cece8163d2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr33920.c
@@ -0,0 +1,51 @@
+/* Testcase by Martin Michlmayr <tbm@cyrius.com> */
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+typedef union lispunion *object;
+struct character
+{
+ long e;
+};
+extern struct symbol Cnil_body;
+extern struct symbol Ct_body;
+struct vector
+{
+ object *v_self;
+};
+union lispunion
+{
+ struct vector v;
+};
+void init_code ()
+{
+ object V659;
+ object _x, _y;
+ object V643;
+ long V648;
+ unsigned char V653;
+ object V651;
+ object V654;
+ object V658;
+
+T1240:
+ if (V648 >= (long)V651)
+ goto T1243;
+ V653 = ((char *) V654->v.v_self)[V648];
+ V659 = (object) V654 + V653;
+T1261:
+ V658 =
+ (object)
+ V659 ? (object) & Ct_body : (object) & Cnil_body;
+ if (V658 == (object) & Cnil_body)
+ goto T1249;
+ goto T1224;
+T1249:
+ V648 = (long) V648 + 1;
+ goto T1240;
+T1243:
+ V643 = (object) & Cnil_body;
+T1224:
+ _y = V643;
+ number_plus (_x, _y);
+}
diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c
index f97c23db93b..9d2fe265791 100644
--- a/gcc/tree-if-conv.c
+++ b/gcc/tree-if-conv.c
@@ -189,8 +189,14 @@ tree_if_conversion (struct loop *loop, bool for_vectorizer)
if (single_succ_p (bb))
{
basic_block bb_n = single_succ (bb);
- if (cond != NULL_TREE)
- add_to_predicate_list (bb_n, cond);
+
+ /* Successor bb inherits predicate of its predecessor. If there
+ is no predicate in predecessor bb, then consider successor bb
+ as always executed. */
+ if (cond == NULL_TREE)
+ cond = boolean_true_node;
+
+ add_to_predicate_list (bb_n, cond);
}
}
@@ -724,6 +730,8 @@ find_phi_replacement_condition (struct loop *loop,
/* Select condition that is not TRUTH_NOT_EXPR. */
tmp_cond = (first_edge->src)->aux;
+ gcc_assert (tmp_cond);
+
if (TREE_CODE (tmp_cond) == TRUTH_NOT_EXPR)
{
edge tmp_edge;