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)