view slides/2018/05/16/memo.txt @ 52:73b27e5c1d79 default tip

auto-Update generated slides by script
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Tue, 16 Apr 2019 18:58:24 +0900
parents f5dac10540d7
children
line wrap: on
line source

 MVMSpeshFactsが主に使われている構造体

 宣言元はfacts.h

```c
 struct MVMSpeshFacts {
     /* Flags indicating things we know. */
     MVMint32 flags;

     /* The number of usages it has. */
     MVMint32 usages;

     /* Known type, if any. */
     MVMObject *type;

     /* Known type post-decontainerization, if any. */
     MVMObject *decont_type;

     /* Known value, if any. */
     union {
         MVMObject *o;
         MVMint64 i;
         MVMnum64 n;
         MVMString *s;
     } value;

     /* The instruction that writes the register (noting we're in SSA form, so
      * this is unique). */
     MVMSpeshIns *writer;

     /* The deoptimization index in effect at the point of declaration, or -1
      * if none yet. */
     MVMint32 deopt_idx;

     /* The log guard the facts depend on, if any. */
     MVMuint32 log_guard;

     /* Has the instruction that wrote this value been deleted? */
     MVMuint32 dead_writer;
 };
```

fact のflag一覧

```c
/* Various fact flags. */
#define MVM_SPESH_FACT_KNOWN_TYPE           1   /* Has a known type. */
#define MVM_SPESH_FACT_KNOWN_VALUE          2   /* Has a known value. */
#define MVM_SPESH_FACT_DECONTED             4   /* Know it's decontainerized. */
#define MVM_SPESH_FACT_CONCRETE             8   /* Know it's a concrete object. */
#define MVM_SPESH_FACT_TYPEOBJ              16  /* Know it's a type object. */
#define MVM_SPESH_FACT_KNOWN_DECONT_TYPE    32  /* Has a known type after decont. */
#define MVM_SPESH_FACT_DECONT_CONCRETE      64  /* Is concrete after decont. */
#define MVM_SPESH_FACT_DECONT_TYPEOBJ       128 /* Is a type object after decont. */
#define MVM_SPESH_FACT_FROM_LOG_GUARD       256 /* Depends on a guard being met. */
#define MVM_SPESH_FACT_HASH_ITER            512 /* Is an iter over hashes. */
#define MVM_SPESH_FACT_ARRAY_ITER           1024 /* Is an iter over arrays
                                                    (mutually exclusive with HASH_ITER, but neither of them is nece    ssarily set) */
#define MVM_SPESH_FACT_KNOWN_BOX_SRC        2048 /* We know what register this value was boxed from */
#define MVM_SPESH_FACT_MERGED_WITH_LOG_GUARD 4096 /* These facts were merged at a PHI node, but at least one of the     incoming facts had a "from log guard" flag set, so we'll have to look for that fact and increment its uses if we u    se this here fact. */
#define MVM_SPESH_FACT_RW_CONT               8192 /* Known to be an rw container */

void MVM_spesh_facts_discover(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshPlanned *p);
void MVM_spesh_facts_depend(MVMThreadContext *tc, MVMSpeshGraph *g,
    MVMSpeshFacts *target, MVMSpeshFacts *source);

```


`spesh/graph.h`の箇所

```
/* An instruction in the spesh graph. */
struct MVMSpeshIns {
    /* Instruction information. */
    const MVMOpInfo *info;

    /* Operand information. */
    MVMSpeshOperand *operands;

    /* Previous and next instructions, within a basic block boundary. */
    MVMSpeshIns *prev;
    MVMSpeshIns *next;

    /* Any annotations on the instruction. */
    MVMSpeshAnn *annotations;
};

```

`core/interp.h`

```
/* Information about an opcode. */
struct MVMOpInfo {
    MVMuint16   opcode;
    const char *name;
    char        mark[2];
    MVMuint16   num_operands;
    MVMuint8    pure;
    MVMuint8    deopt_point;
    MVMuint8    logged;
    MVMuint8    no_inline;
    MVMuint8    jittivity;
    MVMuint8    uses_hll;
    MVMuint8    operands[MVM_MAX_OPERANDS];
};

 
```