From: Michael Matz Date: Sun, 20 Dec 2009 01:15:46 +0000 (+0000) Subject: re PR tree-optimization/42027 (Performance regression in convolution loop optimization) X-Git-Tag: releases/gcc-4.5.0~1568 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e83f4b68e7d86d97d230aa84ea1a0c71c4b43aac;p=thirdparty%2Fgcc.git re PR tree-optimization/42027 (Performance regression in convolution loop optimization) PR tree-optimization/42027 * cfgexpand.c (expand_gimple_cond): Use jumpy sequence for &, &&, | and || if jumps are cheap. From-SVN: r155367 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index be75066423fb..0c02d32622c0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-12-20 Michael Matz + + PR tree-optimization/42027 + * cfgexpand.c (expand_gimple_cond): Use jumpy sequence for &, &&, | + and || if jumps are cheap. + 2009-12-19 Richard Guenther PR lto/42401 diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 08b211e52440..b0921bfe8e96 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -1606,13 +1606,35 @@ expand_gimple_cond (basic_block bb, gimple stmt) && bitmap_bit_p (SA.values, SSA_NAME_VERSION (op0))) { gimple second = SSA_NAME_DEF_STMT (op0); - if (gimple_code (second) == GIMPLE_ASSIGN - && TREE_CODE_CLASS (gimple_assign_rhs_code (second)) - == tcc_comparison) + if (gimple_code (second) == GIMPLE_ASSIGN) { - code = gimple_assign_rhs_code (second); - op0 = gimple_assign_rhs1 (second); - op1 = gimple_assign_rhs2 (second); + enum tree_code code2 = gimple_assign_rhs_code (second); + if (TREE_CODE_CLASS (code2) == tcc_comparison) + { + code = code2; + op0 = gimple_assign_rhs1 (second); + op1 = gimple_assign_rhs2 (second); + } + /* If jumps are cheap turn some more codes into + jumpy sequences. */ + else if (BRANCH_COST (optimize_insn_for_speed_p (), false) < 4) + { + if ((code2 == BIT_AND_EXPR + && TYPE_PRECISION (TREE_TYPE (op0)) == 1 + && TREE_CODE (gimple_assign_rhs2 (second)) != INTEGER_CST) + || code2 == TRUTH_AND_EXPR) + { + code = TRUTH_ANDIF_EXPR; + op0 = gimple_assign_rhs1 (second); + op1 = gimple_assign_rhs2 (second); + } + else if (code2 == BIT_IOR_EXPR || code2 == TRUTH_OR_EXPR) + { + code = TRUTH_ORIF_EXPR; + op0 = gimple_assign_rhs1 (second); + op1 = gimple_assign_rhs2 (second); + } + } } }