Print this page
new smatch

*** 5,14 **** --- 5,15 ---- * Copyright (C) 2004 Linus Torvalds */ #include <assert.h> + #include "liveness.h" #include "parse.h" #include "expression.h" #include "linearize.h" #include "flow.h"
*** 51,80 **** #define USES(x) use(bb, insn->x) #define DEFINES(x) def(bb, insn->x) switch (insn->opcode) { case OP_RET: 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_BINCMP ... OP_BINCMP_END: USES(src1); USES(src2); DEFINES(target); break; /* Uni */ ! case OP_NOT: case OP_NEG: USES(src1); DEFINES(target); break; case OP_SEL: USES(src1); USES(src2); USES(src3); DEFINES(target); --- 52,80 ---- #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; /* 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_UNOP ... OP_UNOP_END: ! case OP_SYMADDR: USES(src1); DEFINES(target); break; case OP_SEL: USES(src1); USES(src2); USES(src3); DEFINES(target);
*** 88,104 **** case OP_STORE: USES(src); USES(target); break; case OP_SETVAL: 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; --- 88,101 ---- case OP_STORE: USES(src); USES(target); break; case OP_SETVAL: + case OP_SETFVAL: 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,125 **** * 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) { --- 106,115 ----
*** 138,172 **** 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) { --- 128,143 ----
*** 274,284 **** FOR_EACH_PTR(src, pseudo) { add_pseudo_exclusive(dest, pseudo); } END_FOR_EACH_PTR(pseudo); } ! 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) --- 245,255 ---- FOR_EACH_PTR(src, pseudo) { add_pseudo_exclusive(dest, pseudo); } END_FOR_EACH_PTR(pseudo); } ! 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)