Finish ir.specification entries for remaining instructions

I was looking over the instruction table to try to understand
what may need to happen to make it easier for a memelim mark 2 to
track memory effects (on object properties and other memory
locations), and I made the mistake of documenting StProp and StPropNT
(currently unused).  This led to finishing the remaining missing
entries...
Esse commit está contido em:
Jordan DeLong
2013-05-26 20:56:36 -07:00
commit de sgolemon
commit aef3e1ea9b
5 arquivos alterados com 231 adições e 94 exclusões
+209 -62
Ver Arquivo
@@ -324,9 +324,9 @@ VectorElem
Instruction set
---------------
1. Checks and Asserts
D:T = CheckType<T> S0:Gen -> L
Check that the type of the src S0 is T, and if so copy it to D. If
@@ -394,16 +394,26 @@ CheckInit S0:Gen -> L
CheckInitMem S0:PtrToGen S1:ConstInt -> L
If the value at S0 + S1 has type Uninit, branch to L.
If the value at S0 + S1 (in bytes) has type Uninit, branch to L.
GuardRefs
GuardRefs S0:FuncPtr S1:Int S2:Int S3:Int S4:Int S5:Int S6:Int
Perform reffiness guard checks. Operands:
S0 - function pointer for the frame
S1 - num params expected in the func
S2 - type Int, but actually a pointer to the func bitvector
S3 - first bit to check, must be a multiple of 64
S4 - mask to check (RefDeps::Record::m_mask entires)
S5 - values to check (RefDeps::Record::m_vals entires)
If any of the checks fail, make a fallback jump. (Jump to a service
request that will chain to a retranslation of this tracelet.)
Perform reffiness guard checks. If any fail, make a fallback jump.
(Jump to a service request that will chain to a retranslation of
this tracelet.)
2. Arithmetic
D:{Int|Dbl} = OpAdd S0:{Int|Dbl} S1:{Int|Dbl}
D:{Int|Dbl} = OpSub S0:{Int|Dbl} S1:{Int|Dbl}
D:{Int|Dbl} = OpMul S0:{Int|Dbl} S1:{Int|Dbl}
@@ -433,6 +443,7 @@ D:Bool = OpNot S0:Bool
3. Type conversions
D:Arr = ConvBoolToArr S0:Bool
D:Arr = ConvDblToArr S0:Dbl
D:Arr = ConvIntToArr S0:Int
@@ -473,6 +484,7 @@ D:Str = ConvCellToStr S0:Cell
4. Boolean predicates
D:Bool = OpGt S0:Gen S1:Gen
D:Bool = OpGte S0:Gen S1:Gen
D:Bool = OpLt S0:Gen S1:Gen
@@ -485,7 +497,7 @@ D:Bool = OpNSame S0:Gen S1:Gen
Perform comparisons with PHP semantics on S0 and S1, and put the
result in D.
D:Bool = InstanceOf S0:Cls S1:Cls S2:ConstBool
D:Bool = InstanceOf S0:Cls S1:Cls S2:ConstBool
Sets D based on whether S0 is a descendant of the class, interface,
or trait in S1. (Note that this is always false for a trait). S1
@@ -519,8 +531,10 @@ D:Bool = IsNTypeMem<T> S0:PtrToGen
IsTypeMem (IsNTypeMem) sets D to true iff the value referenced by S0
is (not) of type T.
5. Branches
There is a conditional branch instruction for each predicate above,
to enable generating efficient compare-and-branch instruction sequences.
@@ -562,12 +576,6 @@ ExitOnVarEnv S0:FramePtr -> L
Loads the VarEnv slot off the ActRec pointed to by S0. If it is
non-zero, jumps to the exit-trace label L.
Marker<bcOff,stackOff,func>
Record HHBC virtual position information at the position of this
instruction. Marker has no executable semantics. The JIT compiler
uses this to generate bytecode<->machine code maps.
Jmp_ [S:T ...] -> L
Unconditional jump to L. L is the name of a DefLabel instruction.
@@ -594,6 +602,7 @@ D:T ... = DefLabel
6. Reference manipulation
D:Cell = Unbox S0:Gen
Unbox S0 if it is boxed, and put the resulting Cell in D.
@@ -612,8 +621,10 @@ D:PtrToBoxedCell = BoxPtr S0:PtrToGen
Boxes the TypeValue that S0 points to if it is not boxed. The result
D points to the same TypedValue as S0 but has a more refined type.
7. Loads
Some of the load instructions have an optional label parameter that
make the load also perform a runtime type check. A load that has a
label parameter present checks that the value it loads has the type T,
@@ -710,9 +721,17 @@ D:Home = LdHome S0:StkPtr S1:ConstInt
Logically packages the location of a pointer into the VM stack and
an offset. S0 will usually be the output of a DefFP.
D:T = LdConst<T>
D:T = LdConst<T,value>
D:ConstT = DefConst<T>
Load a constant value into D. This differs from DefConst in that D
will be allocated a register. It is currently used only for the
GuardRefs instruction.
D:ConstT = DefConst<T,value>
Define a constant value of type T. D is presumed to be globally
available and the DefConst instruction will not actually appear in
the IR instruction stream.
D:Cls = LdCls S0:Str S1:ConstCls
@@ -759,9 +778,24 @@ D:Ctx = GetCtxFwdCall S0:Ctx S1:Func
class. If S0 is an object and S1 is not static, this opcode increfs
S0 and returns it. If S0 is a Cctx, this opcode returns S0.
LdClsMethodCache
LdClsMethod
LdPropAddr
D:FuncCls = LdClsMethodCache S0:ConstStr S1:ConstStr S2:ConstNamedEntity*
Lookup a function and class in the class method targetcache. The
sources to this instruction are:
S0 - class name
S1 - method name
S2 - the NamedEntity* for the class
D:Func = LdClsMethod S0:Cls S1:ConstInt
Load a Func* off of the class method table for S0, at offset S1 (in
method slots).
D:PtrToGen = LdPropAddr S0:Obj S1:ConstInt
Load the address of the object property for S0 at offset S1 (in
bytes) into D.
D:PtrToGen = LdGblAddr S0:Str -> L
@@ -822,36 +856,28 @@ D:Func = LdFuncCachedSafe S0:ConstStr [ -> L ]
Loads the Func named S0 from the target cache. If the function is not
defined, returns null and optionally branches to L.
D:Func = LdCurFuncPtr
...
D:Func& = LdARFuncPtr S0:{StkPtr|FramePtr} S1:ConstInt
Loads the m_func member of an ActRec. S0 is the base address, and
S1 is an offset, such that S0 + S1 points to the base of the ActRec.
LdFuncCls
D:T = LdRaw<T> S0:?? S1:ConstInt
D:PtrToCell = LdContLocalsPtr S0:Obj
"Raw" load from memory---i.e. outside of our type-system.
Loads a pointer to the embedded local variables of S0 (a Continuation
object) into D.
D:T = LdRaw<T> S0:Ptr S1:ConstInt
"Raw" load from memory. S0 is the base address, and is an untyped
pointer. S1 is a constant from the RawMemSlot::Kind enum, which
describes the offset from the base, and the size. The value in D is
assumed to be of type T.
S0 is the base address, and is an untyped pointer. S1 is a constant
from the RawMemSlot::Kind enum, which describes the offset from the
base, and the size. The value in D is assumed to be of type T.
D:BoxedCell = LdStaticLocCached S0:ConstCacheHandle -> L
Load static local value from the targetcache from handle S0. If the
slot is uninitialized, branch to L.
8. Allocation
D:Obj = AllocObj S1:Cls
Allocates a new object of class S1.
@@ -862,12 +888,20 @@ D:Obj = AllocObjFast S1:ConstCls
be instantiated (i.e., S1 is not an abstract class, interface, or
trait).
NewArray
NewTuple
D:Arr = NewArray S0:ConstInt
Allocate a new array with the expected capacity S0.
D:Arr = NewTuple S0:ConstInt S1:StkPtr
Allocate a new array by taking the top S0 elements off the stack
given by S1. Note that this instruction assumes it can take the
values from the stack without increfing them.
9. Call & Return
D:StkPtr = SpillFrame<numArgs,invName> S0:StkPtr
S1:FramePtr
S2:Func
@@ -987,14 +1021,6 @@ ReleaseVVOrExit S0:FramePtr -> L
null, does nothing. If it is an ExtraArgs, deallocates the
ExtraArgs structure. Otherwise jumps to the exit-trace label L.
RaiseError S0:Str
Raises a fatal error with the text in S0 as its message.
RaiseWarning S0:Str
Raises a warning with the text in S0 as its message.
D:StkPtr = GenericRetDecRefs S0:FramePtr S1:ConstInt
Does decrefs of all the current function's locals, where S0 is a
@@ -1010,11 +1036,25 @@ D:StkPtr = GenericRetDecRefs S0:FramePtr S1:ConstInt
10. Stores
StMem S0:PtrToGen S1:ConstInt S2:Gen
Store S2 into the location S0 + S1 (in bytes).
StMemNT S0:PtrToGen S1:ConstInt S2:Gen
Store S2 into the location S0 + S1 (in bytes), without storing the
type tag.
StProp S0:Obj S1:Int S2:Gen
Store S2 into the location S0 + S1 (in bytes).
StPropNT S0:Obj S1:Int S2:Gen
Store S2 into the location S0 + S1 (in bytes), without storing the
type tag.
StLoc<localId> S0:FramePtr S1:Gen
Store S1 to local number localId on the frame pointed to by S0.
@@ -1036,7 +1076,13 @@ D:BoxedCell = StRefNT S0:BoxedCell S1:Cell
change RefData::m_type. Returns a new value for S0, which will now
have the type of S1 after boxing.
StRaw
StRaw S0:?? S1:ConstInt S2:??
"Raw" store to memory---i.e. outside of our type-system.
S0 is the base address, and is an untyped pointer. S1 is a constant
from the RawMemSlow::Kind enum, which describes the offset from the
base, and the size. The value in S2 depends on the value of S1.
D:StkPtr = SpillStack S0:StkP S1:ConstInt, S2...
@@ -1059,6 +1105,7 @@ D:StkPtr = SpillStack S0:StkP S1:ConstInt, S2...
11. Trace exits
SyncABIRegs S0:FramePtr S1:StkPtr
Ensures the cross-tracelet ABI registers are in a consistent state
@@ -1118,13 +1165,22 @@ D:StkPtr = SideExitGuardStk<T,stackOff,takenOff> S0:StkPtr
12. Refcounting and copies
Mov
D:T = Mov S0:T
Defines D as S0. May imply register-to-register moves at code
generation time. Does not imply an incref or any other manipulation
of S0.
D:T* = LdAddr S0:T* S1:ConstInt
Load address. Returns a pointer to (S0 + S1) with the same type as S0.
IncRef
D:Gen = IncRef S0:Gen
Increment the reference count of S0, defining D to be S0 to allow
the ud-chain to be used to track whether the reference count is
consumed or elidable.
DecRefLoc<localId> S0:FramePtr
@@ -1164,6 +1220,13 @@ DecRefNZ S0:Gen
13. Misc
Marker<bcOff,stackOff,func>
Record HHBC virtual position information at the position of this
instruction. Marker has no executable semantics. The JIT compiler
uses this to generate bytecode<->machine code maps.
D:FramePtr = DefFP
Creates a temporary D representing the current vm frame pointer.
@@ -1222,6 +1285,7 @@ Nop
14. Runtime helpers
VerifyParamCls S0:Cls S1:Cls S2:ConstInt
Verify parameter type for classes or traits. If S0 does not extend
@@ -1262,6 +1326,14 @@ RaiseUndefProp S0:Obj S1:ConstStr
Raise a notice for an undefined property named S1 on the class of S0.
RaiseError S0:Str
Raises a fatal error with the text in S0 as its message.
RaiseWarning S0:Str
Raises a warning with the text in S0 as its message.
D:BoxedCell = StaticLocInit S0:ConstStr S1:FramePtr S2:Cell
Get boxed value to initialize static local named S0 in frame S1. If
@@ -1278,15 +1350,47 @@ D:BoxedCell = StaticLocInitCached S0:ConstStr S1:FramePtr S2:Cell
current function is not a closure body or a generator from a
closure.
Print
AddElem
AddNewElem
Concat
ArrayAdd
DefCls
DefFunc
AKExists
ArrayIdx
PrintStr S0:Str
PrintInt S1:Int
PrintBool S1:Bool
Print for various types.
D:Str = Concat S0:Gen S1:Gen
Concatenate S0 and S1 after converting them to strings in a way that
obeys php semantics. (Calling object __toString methods, etc.)
TODO(#2438120): split this opcode up.
D:Arr = AddElemStrKey S0:Arr S1:Str S2:Cell
Add S2 to the array S0 for the key S1, and return the resulting
array.
D:Arr = AddElemIntKey S0:Arr S1:Int S2:Cell
Add S2 to the array S0 for the key S1, and return the resulting
array.
D:Arr = AddNewElem S0:Arr S1:Gen
Add S1 as a new element to the array S0. TODO(#2437059): this is
broken.
D:Arr = ArrayAdd S0:Arr S1:Arr
Has the effects of the php + operator on the two source arrays.
D:Bool = AKExists S0:Cell S1:Cell
Has the effects of array_key_exists(S0, S1). Note that S0 does not
need to be an array---if it is an Obj the ArrayAccess API will be
used, etc.
D:Cell = ArrayIdx S0:ConstTCA S1:Arr S2:{Int,Str} S3:Cell
Checks if the array S1 contains the key S2, and returns the result
if found. Otherwise S3 is returned.
D:Int LdSwitchDblIndex S0:Dbl S1:Int S2:Int
D:Int LdSwitchStrIndex S0:Str S1:Int S2:Int
@@ -1316,6 +1420,7 @@ InterpOneCF S0:FramePtr S1:StkPtr S2:ConstInt S3:ConstInt
15. Register allocation
D:T = Spill S0:T
Stores S0 to a spill location specified by the destination. The
@@ -1328,6 +1433,7 @@ D:T = Reload S0:T
16. Continuations & Closures
D:Obj = CreateCl S0:ConstCls S1:ConstInt S2:FramePtr S3:StkPtr
Creates an object of class S0 (which must be a subclass of Closure),
@@ -1353,8 +1459,24 @@ D:Obj = InlineCreateCont<origFunc,genFunc> S0:{Obj,Null}
weaken the use of the frame in CreateCont when inlining an 'outer'
generator function.
FillContLocals
FillContThis
D:PtrToGen = LdContLocalsPtr S0:Obj
Loads a pointer to the embedded local variables of S0 (a Continuation
object) into D.
FillContLocals S0:FramePtr S1:ConstFunc S2:ConstFunc S3:Obj
Fill the locals for the continuation object S3. Copies the values
for the locals from the frame S0 to their heap location in the
continuation object. S1 is the "original" func, and S2 is the
generator function.
FillContThis S0:Obj S1:PtrToGen S2:ConstInt
Store the continuation object S0 to the special continuation local
used as its $this pointer. S1 should be the result of
LdContLocalsPtr, and S2 is the offset to this pointer (in bytes) to
the address for $this.
ContEnter S0:FramePtr S1:TCA S2:ConstInt S3:FramePtr
@@ -1362,15 +1484,36 @@ ContEnter S0:FramePtr S1:TCA S2:ConstInt S3:FramePtr
object. S1 is the address to jump to. S2 is the bytecode offset in the
caller to return to when the generator body yields. S3 is the current frame.
UnlinkContVarEnv
LinkContVarEnv
ContRaiseCheck
ContPreNext
ContStartedCheck
UnlinkContVarEnv S0:FramePtr
Part of PackCont. Unlinks the VarEnv associated with the
continuation frame S0 from the execution context, if it has one.
LinkContVarEnv S0:FramePtr
Part of UnpackCont. Links the VarEnv associated with the
continuation into the execution context, if it has one.
ContRaiseCheck S0:Obj -> L
Checks whethre the continuation object S0 has raised an exception,
and if so branches to the label L.
ContPreNext S0:Obj -> L
Performs operations needed for the ContNext hhbc opcode. This
includes checking m_done and m_running---if either is not the case
branches to the label L.
ContStartedCheck S0:Obj -> L
Checks if the continuation object S0 has started, and if not
branches to the label L.
17. Debugging and instrumentation
IncStat S0:ConstInt S1:ConstInt S2:ConstBool
Increment stat counter. S0 is the implementation defined stat counter index,
@@ -1400,8 +1543,10 @@ DbgAssertType<T> S0:Cell
Assert that S0 is of type T at runtime. If the assertion fails,
execution is aborted via a hardware exception.
18. Iterators
D:Bool = IterInit S0:{Arr|Obj} S1:FramePtr S2:ConstInt S3:ConstInt
D:Bool = IterInitK S0:{Arr|Obj} S1:FramePtr S2:ConstInt S3:ConstInt S4:ConstInt
@@ -1440,8 +1585,10 @@ IterFree S0:FramePtr S1:ConstInt
Free the iterator variable whose index is given by S1 in the stack
frame pointed to by S0.
19. Vector instruction support
D:PtrToCell = DefMIStateBase
Declares a base register for MInstrState. Currently this is always %rsp.
-13
Ver Arquivo
@@ -335,9 +335,6 @@ Address CodeGenerator::cgInst(IRInstruction* inst) {
#define NOOP_OPCODE(opcode) \
void CodeGenerator::cg##opcode(IRInstruction*) {}
#define PUNT_OPCODE(opcode) \
void CodeGenerator::cg##opcode(IRInstruction*) { CG_PUNT(opcode); }
#define CALL_OPCODE(opcode) \
void CodeGenerator::cg##opcode(IRInstruction* i) { cgCallNative(i); }
@@ -345,8 +342,6 @@ Address CodeGenerator::cgInst(IRInstruction* inst) {
CALL_OPCODE(opcode) \
CALL_OPCODE(opcode ## Stk)
PUNT_OPCODE(DefCls)
NOOP_OPCODE(DefConst)
NOOP_OPCODE(DefFP)
NOOP_OPCODE(DefSP)
@@ -453,7 +448,6 @@ CALL_OPCODE(IssetElem)
CALL_OPCODE(EmptyElem)
#undef NOOP_OPCODE
#undef PUNT_OPCODE
// Thread chain of patch locations using the 4 byte space in each jmp/jcc
static void prependPatchAddr(CodegenState& state,
@@ -4973,13 +4967,6 @@ void CodeGenerator::cgInterpOneCF(IRInstruction* inst) {
m_tx64->emitServiceReq(SRFlags::EmitInA, REQ_RESUME, 0ull);
}
void CodeGenerator::cgDefFunc(IRInstruction* inst) {
SSATmp* dst = inst->getDst();
SSATmp* func = inst->getSrc(0);
cgCallHelper(m_as, (TCA)defFuncHelper, dst, kSyncPoint,
ArgGroup(m_regs).ssa(func), DestType::None);
}
void CodeGenerator::cgFillContThis(IRInstruction* inst) {
SSATmp* cont = inst->getSrc(0);
auto baseReg = m_regs[inst->getSrc(1)].getReg();
@@ -442,8 +442,7 @@ void HhbcTranslator::emitArrayAdd() {
}
SSATmp* tr = popC();
SSATmp* tl = popC();
// the ArrrayAdd helper decrefs its args, so don't decref pop'ed values
// TODO task 1805916: verify that ArrayAdd increfs its result
// The ArrayAdd helper decrefs its args, so don't decref pop'ed values.
push(gen(ArrayAdd, tl, tr));
}
@@ -468,10 +467,10 @@ void HhbcTranslator::emitAddElemC() {
}
void HhbcTranslator::emitAddNewElemC() {
// TODO(#2437059): this is broken
SSATmp* val = popC();
SSATmp* arr = popC();
// the AddNewElem helper decrefs its args, so don't decref pop'ed values
// TODO task 1805916: verify that NewElem increfs its result
// The AddNewElem helper decrefs its args, so don't decref pop'ed values.
push(gen(AddNewElem, arr, val));
}
+19 -12
Ver Arquivo
@@ -161,7 +161,12 @@ O(CheckLoc, ND, S(FramePtr), E) \
O(CheckStk, D(StkPtr), S(StkPtr), E) \
O(CastStk, D(StkPtr), S(StkPtr), Mem|N|Er) \
O(AssertStk, D(StkPtr), S(StkPtr), E) \
O(GuardRefs, ND, SUnk, E) \
O(GuardRefs, ND, S(Func) \
S(Int) \
S(Int) \
S(Int) \
S(Int) \
S(Int), E) \
O(AssertLoc, ND, S(FramePtr), E) \
O(OverrideLoc, ND, S(FramePtr), E) \
O(OpAdd, DArith, S(Int,Dbl) S(Int,Dbl), C) \
@@ -294,7 +299,9 @@ O(LdClsCns, DParam, CStr CStr, NF) \
O(LookupClsCns, DParam, CStr CStr, E|Refs|Er|N|Mem) \
O(LdCns, DParam, CStr, NF) \
O(LookupCns, DParam, CStr, E|Refs|Er|N|Mem) \
O(LdClsMethodCache, D(FuncCls), SUnk, N|C|E|Refs|Er|Mem) \
O(LdClsMethodCache, D(FuncCls), C(Str) \
C(Str) \
C(NamedEntity), N|C|E|Refs|Er|Mem) \
O(LdClsMethodFCache, D(FuncCtx), C(Cls) CStr S(Obj,Cls,Ctx), N|C|E|Er) \
O(GetCtxFwdCall, D(Ctx), S(Ctx) S(Func), C) \
O(LdClsMethod, D(Func), S(Cls) C(Int), C) \
@@ -309,7 +316,7 @@ O(LdFunc, D(Func), S(Str), E|N|CRc|Er) \
O(LdFuncCached, D(Func), CStr, N|C|E|Er) \
O(LdFuncCachedSafe, D(Func), CStr, C) \
O(LdARFuncPtr, D(Func), S(StkPtr,FramePtr) C(Int), C) \
O(LdContLocalsPtr, D(PtrToCell), S(Obj), C) \
O(LdContLocalsPtr, D(PtrToGen), S(Obj), C) \
O(LdSSwitchDestFast, D(TCA), S(Gen), N) \
O(LdSSwitchDestSlow, D(TCA), S(Gen), E|N|Refs|Er) \
O(LdSwitchDblIndex, D(Int), S(Dbl) S(Int) S(Int), N) \
@@ -323,7 +330,7 @@ O(CreateCl, D(Obj), C(Cls) \
C(Int) \
S(FramePtr) \
S(StkPtr), Mem|N) \
O(NewArray, D(Arr), C(Int), E|Mem|N|PRc) \
O(NewArray, D(Arr), C(Int), N|PRc) \
O(NewTuple, D(Arr), C(Int) S(StkPtr), E|Mem|N|PRc|CRc) \
O(LdRaw, DParam, SUnk, NF) \
O(FreeActRec, D(FramePtr), S(FramePtr), Mem) \
@@ -379,7 +386,7 @@ O(DecRefMem, ND, S(PtrToGen) \
C(Int), N|E|Mem|CRc|Refs) \
O(DecRefNZ, ND, S(Gen), Mem|CRc) \
O(DecRefNZOrBranch, ND, S(Gen), Mem|CRc) \
O(DefLabel, DMulti, SUnk, E) \
O(DefLabel, DMulti, NA, E) \
O(Marker, ND, NA, E) \
O(DefInlineFP, D(FramePtr), S(StkPtr) S(StkPtr), NF) \
O(InlineReturn, ND, S(FramePtr), E) \
@@ -411,9 +418,7 @@ O(AddNewElem, D(Arr), SUnk, N|Mem|CRc|PRc) \
/* name dstinfo srcinfo flags */ \
O(DefCns, D(Bool), C(Str) S(Cell), E|N|Mem|CRc) \
O(Concat, D(Str), S(Gen) S(Gen), N|Mem|CRc|PRc|Refs) \
O(ArrayAdd, D(Arr), SUnk, N|Mem|CRc|PRc) \
O(DefCls, ND, SUnk, C|E|N) \
O(DefFunc, ND, SUnk, C|E|N|Er) \
O(ArrayAdd, D(Arr), S(Arr) S(Arr), N|Mem|CRc|PRc) \
O(AKExists, D(Bool), S(Cell) S(Cell), C|N) \
O(InterpOne, D(StkPtr), S(FramePtr) S(StkPtr) \
C(Int) C(Int), E|N|Mem|Refs|Er) \
@@ -432,7 +437,7 @@ O(FillContLocals, ND, S(FramePtr) \
C(Func) \
S(Obj), E|N|Mem) \
O(FillContThis, ND, S(Obj) \
S(PtrToCell) C(Int), E|Mem) \
S(PtrToGen) C(Int), E|Mem) \
O(ContEnter, ND, S(FramePtr) \
S(TCA) C(Int) S(FramePtr), E|Mem) \
O(UnlinkContVarEnv, ND, S(FramePtr), E|N|Mem) \
@@ -584,9 +589,11 @@ O(EmptyElem, D(Bool), C(TCA) \
O(IncStat, ND, C(Int) C(Int) C(Bool), E|Mem) \
O(IncStatGrouped, ND, CStr CStr C(Int), E|N|Mem) \
O(IncTransCounter, ND, NA, E) \
O(ArrayIdx, D(Cell), C(TCA) S(Arr) S(Int,Str) S(Cell), \
E|N|CRc|PRc|Refs|Mem) \
O(DbgAssertRefCount, ND, SUnk, N|E) \
O(ArrayIdx, D(Cell), C(TCA) \
S(Arr) \
S(Int,Str) \
S(Cell), E|N|CRc|PRc|Refs|Mem) \
O(DbgAssertRefCount, ND, S(Counted,StaticStr,StaticArr), N|E) \
O(DbgAssertPtr, ND, S(PtrToGen), N|E) \
O(DbgAssertType, ND, S(Cell), E) \
O(Nop, ND, NA, NF) \
@@ -816,9 +816,6 @@ void LinearScan::computePreColoringHint() {
case AKExists:
normalHint(2);
break;
case DefFunc:
normalHint(1);
break;
case OpEq:
case OpNeq:
case OpSame: