aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@ppc970.osdl.org>2004-11-29 17:05:33 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-07 21:05:17 -0700
commitd984f00104a681adefd3692f992952da74bfc199 (patch)
treed61f762ddcd7ce596af82ed637f21e0288e9f735 /simplify.c
parentAfter doing liveness analysis, remove purely internal defs from def list. (diff)
downloadsparse-d984f00104a681adefd3692f992952da74bfc199.tar.gz
sparse-d984f00104a681adefd3692f992952da74bfc199.tar.bz2
sparse-d984f00104a681adefd3692f992952da74bfc199.zip
Cleanup. Move the OP_SEL and OP_BR simplification out into
their own functions. This makes ready for moving the OP_BR phi-following to the instruction simplification phase.
Diffstat (limited to 'simplify.c')
-rw-r--r--simplify.c47
1 files changed, 29 insertions, 18 deletions
diff --git a/simplify.c b/simplify.c
index 3dbd511..d630c94 100644
--- a/simplify.c
+++ b/simplify.c
@@ -470,9 +470,35 @@ static int simplify_cast(struct instruction *insn)
return replace_with_pseudo(insn, insn->src);
}
-int simplify_instruction(struct instruction *insn)
+static int simplify_select(struct instruction *insn, struct instruction *setcc)
{
pseudo_t cond;
+
+ assert(setcc && setcc->bb);
+ if (dead_insn(insn, &insn->src1, &insn->src2)) {
+ setcc->bb = NULL;
+ return REPEAT_CSE;
+ }
+ cond = setcc->src;
+ if (!constant(cond) && insn->src1 != insn->src2)
+ return 0;
+ setcc->bb = NULL;
+ kill_use(&setcc->cond);
+ replace_with_pseudo(insn, cond->value ? insn->src1 : insn->src2);
+ return REPEAT_CSE;
+}
+
+static int simplify_branch(struct instruction *insn)
+{
+ pseudo_t cond = insn->cond;
+ if (!cond || !constant(cond))
+ return 0;
+ insert_branch(insn->bb, insn, cond->value ? insn->bb_true : insn->bb_false);
+ return REPEAT_CSE;
+}
+
+int simplify_instruction(struct instruction *insn)
+{
static struct instruction *last_setcc;
struct instruction *setcc = last_setcc;
@@ -509,24 +535,9 @@ int simplify_instruction(struct instruction *insn)
last_setcc = insn;
return 0;
case OP_SEL:
- assert(setcc && setcc->bb);
- if (dead_insn(insn, &insn->src1, &insn->src2)) {
- setcc->bb = NULL;
- return REPEAT_CSE;
- }
- cond = setcc->src;
- if (!constant(cond) && insn->src1 != insn->src2)
- return 0;
- setcc->bb = NULL;
- kill_use(&setcc->cond);
- replace_with_pseudo(insn, cond->value ? insn->src1 : insn->src2);
- return REPEAT_CSE;
+ return simplify_select(insn, setcc);
case OP_BR:
- cond = insn->cond;
- if (!cond || !constant(cond))
- break;
- insert_branch(insn->bb, insn, cond->value ? insn->bb_true : insn->bb_false);
- return REPEAT_CSE;
+ return simplify_branch(insn);
}
return 0;
}