aboutsummaryrefslogtreecommitdiff
path: root/gcc/ccmp.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ccmp.cc')
-rw-r--r--gcc/ccmp.cc12
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 ();