Print this page
new smatch
@@ -23,19 +23,16 @@
/* Terminator */
[OP_RET] = "ret",
[OP_BR] = "br",
[OP_CBR] = "cbr",
[OP_SWITCH] = "switch",
- [OP_INVOKE] = "invoke",
[OP_COMPUTEDGOTO] = "jmp *",
- [OP_UNWIND] = "unwind",
/* Binary */
[OP_ADD] = "add",
[OP_SUB] = "sub",
- [OP_MULU] = "mulu",
- [OP_MULS] = "muls",
+ [OP_MUL] = "mul",
[OP_DIVU] = "divu",
[OP_DIVS] = "divs",
[OP_MODU] = "modu",
[OP_MODS] = "mods",
[OP_SHL] = "shl",
@@ -44,12 +41,10 @@
/* Logical */
[OP_AND] = "and",
[OP_OR] = "or",
[OP_XOR] = "xor",
- [OP_AND_BOOL] = "and-bool",
- [OP_OR_BOOL] = "or-bool",
/* Binary comparison */
[OP_SET_EQ] = "seteq",
[OP_SET_NE] = "setne",
[OP_SET_LE] = "setle",
@@ -67,32 +62,31 @@
/* Special three-input */
[OP_SEL] = "select",
/* Memory */
- [OP_MALLOC] = "malloc",
- [OP_FREE] = "free",
- [OP_ALLOCA] = "alloca",
[OP_LOAD] = "load",
[OP_STORE] = "store",
[OP_SETVAL] = "set",
- [OP_GET_ELEMENT_PTR] = "getelem",
/* Other */
[OP_PHI] = "phi",
[OP_PHISOURCE] = "phisrc",
[OP_COPY] = "copy",
- [OP_CAST] = "cast",
- [OP_SCAST] = "scast",
- [OP_FPCAST] = "fpcast",
+ [OP_SEXT] = "sext",
+ [OP_ZEXT] = "zext",
+ [OP_TRUNC] = "trunc",
+ [OP_FCVTU] = "fcvtu",
+ [OP_FCVTS] = "fcvts",
+ [OP_UCVTF] = "ucvtf",
+ [OP_SCVTF] = "scvtf",
+ [OP_FCVTF] = "fcvtf",
+ [OP_UTPTR] = "utptr",
+ [OP_PTRTU] = "utptr",
[OP_PTRCAST] = "ptrcast",
[OP_CALL] = "call",
- [OP_VANEXT] = "va_next",
- [OP_VAARG] = "va_arg",
[OP_SLICE] = "slice",
- [OP_SNOP] = "snop",
- [OP_LNOP] = "lnop",
[OP_NOP] = "nop",
[OP_DEATHNOTE] = "dead",
[OP_ASM] = "asm",
/* Sparse tagging (line numbers, context, whatever) */
@@ -392,11 +386,11 @@
output_comment(state, "reg %s flushed while busy is %d!", reg->name, reg->busy);
if (!reg->contains)
return;
reg->dead = 0;
reg->used = 1;
- FOR_EACH_PTR(reg->contains, pseudo) {
+ FOR_EACH_PTR_TAG(reg->contains, pseudo) {
if (CURRENT_TAG(pseudo) & TAG_DEAD)
continue;
if (!(CURRENT_TAG(pseudo) & TAG_DIRTY))
continue;
flush_one_pseudo(state, reg, pseudo);
@@ -445,11 +439,11 @@
static void mark_reg_dead(struct bb_state *state, pseudo_t pseudo, struct hardreg *reg)
{
pseudo_t p;
- FOR_EACH_PTR(reg->contains, p) {
+ FOR_EACH_PTR_TAG(reg->contains, p) {
if (p != pseudo)
continue;
if (CURRENT_TAG(p) & TAG_DEAD)
continue;
output_comment(state, "marking pseudo %s in reg %s dead", show_pseudo(pseudo), reg->name);
@@ -530,11 +524,11 @@
for (i = 0; i < REGNO; i++) {
pseudo_t p;
reg = hardregs + i;
- FOR_EACH_PTR(reg->contains, p) {
+ FOR_EACH_PTR_TAG(reg->contains, p) {
if (p == pseudo) {
last_reg = i;
output_comment(state, "found pseudo %s in reg %s (busy=%d)", show_pseudo(pseudo), reg->name, reg->busy);
return reg;
}
@@ -870,11 +864,11 @@
static void kill_dead_reg(struct hardreg *reg)
{
if (reg->dead) {
pseudo_t p;
- FOR_EACH_PTR(reg->contains, p) {
+ FOR_EACH_PTR_TAG(reg->contains, p) {
if (CURRENT_TAG(p) & TAG_DEAD) {
DELETE_CURRENT_PTR(p);
reg->dead--;
}
} END_FOR_EACH_PTR(p);
@@ -910,11 +904,11 @@
}
static int is_dead_reg(struct bb_state *state, pseudo_t pseudo, struct hardreg *reg)
{
pseudo_t p;
- FOR_EACH_PTR(reg->contains, p) {
+ FOR_EACH_PTR_TAG(reg->contains, p) {
if (p == pseudo)
return CURRENT_TAG(p) & TAG_DEAD;
} END_FOR_EACH_PTR(p);
return 0;
}
@@ -1005,11 +999,11 @@
output_comment(state, "killing pseudo %s", show_pseudo(pseudo));
for (i = 0; i < REGNO; i++) {
pseudo_t p;
reg = hardregs + i;
- FOR_EACH_PTR(reg->contains, p) {
+ FOR_EACH_PTR_TAG(reg->contains, p) {
if (p != pseudo)
continue;
if (CURRENT_TAG(p) & TAG_DEAD)
reg->dead--;
output_comment(state, "removing pseudo %s from reg %s",
@@ -1402,13 +1396,12 @@
case OP_COPY:
generate_copy(state, insn);
break;
- case OP_ADD: case OP_MULU: case OP_MULS:
+ case OP_ADD: case OP_MUL:
case OP_AND: case OP_OR: case OP_XOR:
- case OP_AND_BOOL: case OP_OR_BOOL:
generate_commutative_binop(state, insn);
break;
case OP_SUB: case OP_DIVU: case OP_DIVS:
case OP_MODU: case OP_MODS:
@@ -1418,11 +1411,18 @@
case OP_BINCMP ... OP_BINCMP_END:
generate_compare(state, insn);
break;
- case OP_CAST: case OP_SCAST: case OP_FPCAST: case OP_PTRCAST:
+ case OP_SEXT: case OP_ZEXT:
+ case OP_TRUNC:
+ case OP_PTRCAST:
+ case OP_UTPTR:
+ case OP_PTRTU:
+ case OP_FCVTU: case OP_FCVTS:
+ case OP_UCVTF: case OP_SCVTF:
+ case OP_FCVTF:
generate_cast(state, insn);
break;
case OP_SEL:
generate_select(state, insn);
@@ -1542,11 +1542,11 @@
/* See if we have that pseudo in a register.. */
for (i = 0; i < REGNO; i++) {
struct hardreg *reg = hardregs + i;
pseudo_t p;
- FOR_EACH_PTR(reg->contains, p) {
+ FOR_EACH_PTR_TAG(reg->contains, p) {
if (p == pseudo) {
write_reg_to_storage(state, reg, pseudo, out);
return;
}
} END_FOR_EACH_PTR(p);
@@ -1650,11 +1650,11 @@
struct hardreg *reg = hardregs + out->regno;
pseudo_t p;
int flushme = 0;
reg->busy = REG_FIXED;
- FOR_EACH_PTR(reg->contains, p) {
+ FOR_EACH_PTR_TAG(reg->contains, p) {
if (p == entry->pseudo) {
flushme = -100;
continue;
}
if (CURRENT_TAG(p) & TAG_DEAD)
@@ -1947,11 +1947,11 @@
struct string_list *filelist = NULL;
char *file;
compile(sparse_initialize(argc, argv, &filelist));
dbg_dead = 1;
- FOR_EACH_PTR_NOTAG(filelist, file) {
+ FOR_EACH_PTR(filelist, file) {
compile(sparse(file));
- } END_FOR_EACH_PTR_NOTAG(file);
+ } END_FOR_EACH_PTR(file);
return 0;
}