From patchwork Thu Oct 14 19:23:45 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Small fix for ifcvt X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 67854 Message-Id: <20101014192345.GA18103@tyan-ft48-01.lab.bos.redhat.com> To: gcc-patches@gcc.gnu.org Date: Thu, 14 Oct 2010 21:23:45 +0200 From: Jakub Jelinek List-Id: Hi! If a _Bool SSA_NAME != boolean_false_node condition is fold_build2_loc'ed into the SSA_NAME itself, invert_truthvalue_loc for it is TRUTH_NOT_EXPR , which is not a valid condition, so add_to_dst_predicate_list forces it into queued stmts and then uses the new temporary as the condition. We end up then with D.12346_679 = !D.12345_678 and/or D.12347_680 = D.12345_678 || D.12346_679 useless statements in the basic block, which prevent further vectorization. By canonicalization of the condition to SSA_NAME == boolean_false_node we can avoid emitting those useless stmts. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2010-10-14 Jakub Jelinek PR tree-optimization/46008 * tree-if-conv.c (predicate_bbs): Try to canonicalize c2 if possible. Jakub --- gcc/tree-if-conv.c.jj 2010-09-06 08:42:00.000000000 +0200 +++ gcc/tree-if-conv.c 2010-10-13 17:49:58.000000000 +0200 @@ -915,7 +915,7 @@ predicate_bbs (loop_p loop) case GIMPLE_COND: { - tree c2; + tree c2, tem; edge true_edge, false_edge; location_t loc = gimple_location (stmt); tree c = fold_build2_loc (loc, gimple_cond_code (stmt), @@ -932,6 +932,9 @@ predicate_bbs (loop_p loop) /* If C is false, then FALSE_EDGE is taken. */ c2 = invert_truthvalue_loc (loc, unshare_expr (c)); + tem = canonicalize_cond_expr_cond (c2); + if (tem) + c2 = tem; add_to_dst_predicate_list (loop, false_edge, cond, c2); cond = NULL_TREE;