From: spop Date: Wed, 26 May 2010 16:47:08 +0000 (+0000) Subject: Do not check the if-convertibility of statements that are not predicated. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=12ec13dfcbd60f62bb1d2b157384107198f9a8d6;p=thirdparty%2Fgcc.git Do not check the if-convertibility of statements that are not predicated. 2010-05-26 Sebastian Pop * tree-if-conv.c (if_convertible_gimple_assign_stmt_p): Do not special case loop->header. (is_predicated): New. (if_convertible_loop_p): Call it. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159887 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ed863df906ce..31bc2922b64a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-05-26 Sebastian Pop + + * tree-if-conv.c (if_convertible_gimple_assign_stmt_p): Do not + special case loop->header. + (is_predicated): New. + (if_convertible_loop_p): Call it. + 2010-05-26 Sebastian Pop * tree-if-conv.c (add_to_dst_predicate_list): Do not pass a statemet diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c index da6b1cde27aa..8dc1de682be2 100644 --- a/gcc/tree-if-conv.c +++ b/gcc/tree-if-conv.c @@ -274,9 +274,7 @@ if_convertible_gimple_assign_stmt_p (struct loop *loop, basic_block bb, return false; } - /* See if it needs speculative loading or not. */ - if (bb != loop->header - && gimple_assign_rhs_could_trap_p (stmt)) + if (gimple_assign_rhs_could_trap_p (stmt)) { if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, "tree could trap...\n"); @@ -588,6 +586,19 @@ predicate_bbs (loop_p loop) return true; } +/* Returns true when BB has a predicate that is not trivial: true or + NULL_TREE. */ + +static bool +is_predicated (basic_block bb) +{ + tree cond = (tree) bb->aux; + + return (cond != NULL_TREE + && cond != boolean_true_node + && !integer_onep (cond)); +} + /* Return true when LOOP is if-convertible. LOOP is if-convertible if: - it is innermost, @@ -682,6 +693,10 @@ if_convertible_loop_p (struct loop *loop) basic_block bb = ifc_bbs[i]; gimple_stmt_iterator itr; + /* For non predicated BBs, don't check their statements. */ + if (!is_predicated (bb)) + continue; + for (itr = gsi_start_bb (bb); !gsi_end_p (itr); gsi_next (&itr)) if (!if_convertible_stmt_p (loop, bb, gsi_stmt (itr))) return false;