aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2018-08-04 22:58:34 +0200
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2020-10-27 06:16:13 +0100
commit6803f19583ea7fefa246427d0ed1edd0e65161bb (patch)
tree57acd4026f9d97df4b1ada55cad33943a4026266
parentcfca7b4c6cb48283cb554fc91dc859ff669f2547 (diff)
downloadsparse-6803f19583ea7fefa246427d0ed1edd0e65161bb.tar.gz
replace nbr_users() & multi_users() by one_use()
During simplification, we're only interested to know if a pseudo is used only once or more than once. This can be checked quicker than getting the exact number of users. So, replace the last call to nbr_users() and the calls to multi_users() by a call to one_use() which has a slightly clearer name. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--linearize.h4
-rw-r--r--simplify.c18
2 files changed, 11 insertions, 11 deletions
diff --git a/linearize.h b/linearize.h
index 76efd0b4..4b182f07 100644
--- a/linearize.h
+++ b/linearize.h
@@ -260,9 +260,9 @@ static inline int has_users(pseudo_t p)
return !pseudo_user_list_empty(p->users);
}
-static inline bool multi_users(pseudo_t p)
+static inline bool one_use(pseudo_t p)
{
- return ptr_list_multiple((struct ptr_list *)(p->users));
+ return !ptr_list_multiple((struct ptr_list *)(p->users));
}
static inline int nbr_users(pseudo_t p)
diff --git a/simplify.c b/simplify.c
index 6caf6cbc..3a3a7565 100644
--- a/simplify.c
+++ b/simplify.c
@@ -690,7 +690,7 @@ static int simplify_mask_or_and(struct instruction *insn, unsigned long long mas
// if (M' & M) == 0: ((a & M') | b) -> b
return replace_pseudo(insn, &insn->src1, orb);
}
- if (multi_users(insn->src1))
+ if (!one_use(insn->src1))
return 0; // can't modify anything inside the OR
if (nmask == mask) {
struct instruction *or = insn->src1->def;
@@ -698,7 +698,7 @@ static int simplify_mask_or_and(struct instruction *insn, unsigned long long mas
// if (M' & M) == M: ((a & M') | b) -> (a | b)
return replace_pseudo(or, arg, and->src1);
}
- if (nmask != omask && !multi_users(ora)) {
+ if (nmask != omask && one_use(ora)) {
// if (M' & M) != M': AND(a, M') -> AND(a, (M' & M))
and->src2 = value_pseudo(nmask);
return REPEAT_CSE;
@@ -738,7 +738,7 @@ static int simplify_mask_or(struct instruction *insn, unsigned long long mask, s
// if (C & M) == M: OR(x, C) -> M
return replace_pseudo(insn, &insn->src1, value_pseudo(mask));
}
- if (nval != oval && !multi_users(or->target)) {
+ if (nval != oval && one_use(or->target)) {
// if (C & M) != C: OR(x, C) -> OR(x, (C & M))
return replace_pseudo(or, &or->src2, value_pseudo(nval));
}
@@ -772,7 +772,7 @@ static int simplify_mask_shift(struct instruction *sh, unsigned long long mask)
return 0;
switch (DEF_OPCODE(inner, sh->src1)) {
case OP_OR:
- if (!multi_users(sh->target))
+ if (one_use(sh->target))
return simplify_mask_shift_or(sh, inner, mask);
break;
}
@@ -871,7 +871,7 @@ static int simplify_shift(struct instruction *insn, pseudo_t pseudo, long long v
return replace_with_value(insn, 0);
if (nmask == mask)
return replace_pseudo(insn, &insn->src1, def->src1);
- if (nbr_users(pseudo) > 1)
+ if (!one_use(pseudo))
break;
def->opcode = OP_LSR;
def->src2 = insn->src2;
@@ -1041,7 +1041,7 @@ static int simplify_seteq_setne(struct instruction *insn, long long value)
// and same for setne/eq ... 0/1
return replace_pseudo(insn, &insn->src1, def->src);
case OP_TRUNC:
- if (multi_users(old))
+ if (!one_use(old))
break;
// convert
// trunc.n %s <- (o) %a
@@ -1352,7 +1352,7 @@ static int simplify_associative_binop(struct instruction *insn)
insn->src2 = eval_op(insn->opcode, insn->size, insn->src2, def->src2);
return replace_pseudo(insn, &insn->src1, def->src1);
}
- if (multi_users(def->target))
+ if (!one_use(def->target))
return 0;
switch_pseudo(def, &def->src1, insn, &insn->src2);
return REPEAT_CSE;
@@ -1568,7 +1568,7 @@ static int simplify_cast(struct instruction *insn)
/* A cast of a AND might be a no-op.. */
switch (insn->opcode) {
case OP_TRUNC:
- if (multi_users(src))
+ if (!one_use(src))
break;
def->opcode = OP_TRUNC;
def->orig_type = def->type;
@@ -1586,7 +1586,7 @@ static int simplify_cast(struct instruction *insn)
break;
// OK, sign bit is 0
case OP_ZEXT:
- if (multi_users(src))
+ if (!one_use(src))
break;
// transform:
// and.n %b <- %a, M