Print this page
new smatch
@@ -5,10 +5,11 @@
* Copyright (C) 2004 Linus Torvalds
*/
#include <assert.h>
+#include "liveness.h"
#include "parse.h"
#include "expression.h"
#include "linearize.h"
#include "flow.h"
@@ -51,30 +52,29 @@
#define USES(x) use(bb, insn->x)
#define DEFINES(x) def(bb, insn->x)
switch (insn->opcode) {
case OP_RET:
+ case OP_COMPUTEDGOTO:
USES(src);
break;
case OP_CBR:
case OP_SWITCH:
USES(cond);
break;
- case OP_COMPUTEDGOTO:
- USES(target);
- break;
-
/* Binary */
case OP_BINARY ... OP_BINARY_END:
+ case OP_FPCMP ... OP_FPCMP_END:
case OP_BINCMP ... OP_BINCMP_END:
USES(src1); USES(src2); DEFINES(target);
break;
/* Uni */
- case OP_NOT: case OP_NEG:
+ case OP_UNOP ... OP_UNOP_END:
+ case OP_SYMADDR:
USES(src1); DEFINES(target);
break;
case OP_SEL:
USES(src1); USES(src2); USES(src3); DEFINES(target);
@@ -88,17 +88,14 @@
case OP_STORE:
USES(src); USES(target);
break;
case OP_SETVAL:
+ case OP_SETFVAL:
DEFINES(target);
break;
- case OP_SYMADDR:
- USES(symbol); DEFINES(target);
- break;
-
/* Other */
case OP_PHI:
/* Phi-nodes are "backwards" nodes. Their def doesn't matter */
phi_defines(insn, insn->target, def);
break;
@@ -109,17 +106,10 @@
* up and expanded by the OP_PHI
*/
USES(phi_src);
break;
- case OP_CAST:
- case OP_SCAST:
- case OP_FPCAST:
- case OP_PTRCAST:
- USES(src); DEFINES(target);
- break;
-
case OP_CALL:
USES(func);
if (insn->target != VOID)
DEFINES(target);
FOR_EACH_PTR(insn->arguments, pseudo) {
@@ -138,35 +128,16 @@
case OP_RANGE:
USES(src1); USES(src2); USES(src3);
break;
case OP_BADOP:
- case OP_INVOKE:
- case OP_UNWIND:
- case OP_MALLOC:
- case OP_FREE:
- case OP_ALLOCA:
- case OP_GET_ELEMENT_PTR:
- case OP_VANEXT:
- case OP_VAARG:
- case OP_SNOP:
- case OP_LNOP:
case OP_NOP:
case OP_CONTEXT:
break;
}
}
-int pseudo_in_list(struct pseudo_list *list, pseudo_t pseudo)
-{
- pseudo_t old;
- FOR_EACH_PTR(list,old) {
- if (old == pseudo)
- return 1;
- } END_FOR_EACH_PTR(old);
- return 0;
-}
static int liveness_changed;
static void add_pseudo_exclusive(struct pseudo_list **list, pseudo_t pseudo)
{
@@ -274,11 +245,11 @@
FOR_EACH_PTR(src, pseudo) {
add_pseudo_exclusive(dest, pseudo);
} END_FOR_EACH_PTR(pseudo);
}
-void track_phi_uses(struct instruction *insn)
+static void track_phi_uses(struct instruction *insn)
{
pseudo_t phi;
FOR_EACH_PTR(insn->phi_list, phi) {
struct instruction *def;
if (phi == VOID || !phi->def)