diff options
Diffstat (limited to 'gcc/ccmp.cc')
-rw-r--r-- | gcc/ccmp.cc | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/gcc/ccmp.cc b/gcc/ccmp.cc index 09d6b55..7cb525a 100644 --- a/gcc/ccmp.cc +++ b/gcc/ccmp.cc @@ -90,9 +90,10 @@ ccmp_tree_comparison_p (tree t, basic_block bb) If all checks OK in expand_ccmp_expr, it emits insns in prep_seq, then insns in gen_seq. */ -/* Check whether G is a potential conditional compare candidate. */ +/* Check whether G is a potential conditional compare candidate; OUTER is true if + G is the outer most AND/IOR. */ static bool -ccmp_candidate_p (gimple *g) +ccmp_candidate_p (gimple *g, bool outer = false) { tree lhs, op0, op1; gimple *gs0, *gs1; @@ -109,8 +110,9 @@ ccmp_candidate_p (gimple *g) lhs = gimple_assign_lhs (g); op0 = gimple_assign_rhs1 (g); op1 = gimple_assign_rhs2 (g); - if ((TREE_CODE (op0) != SSA_NAME) || (TREE_CODE (op1) != SSA_NAME) - || !has_single_use (lhs)) + if ((TREE_CODE (op0) != SSA_NAME) || (TREE_CODE (op1) != SSA_NAME)) + return false; + if (!outer && !has_single_use (lhs)) return false; bb = gimple_bb (g); @@ -284,7 +286,7 @@ expand_ccmp_expr (gimple *g, machine_mode mode) rtx_insn *last; rtx tmp; - if (!ccmp_candidate_p (g)) + if (!ccmp_candidate_p (g, true)) return NULL_RTX; last = get_last_insn (); |