Skip to content

Commit e3eecc3

Browse files
committed
kmir/rt/data: remove mut checks from makeProjectedUpdate, only for final write
1 parent 2c94bf8 commit e3eecc3

File tree

1 file changed

+22
-28
lines changed
  • kmir/src/kmir/kdist/mir-semantics/rt

1 file changed

+22
-28
lines changed

kmir/src/kmir/kdist/mir-semantics/rt/data.md

+22-28
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ In contrast to regular write operations, the value does not have to be _mutable_
329329
330330
rule <k> VAL:TypedLocal ~> #markMoved(OLDLOCAL, local(I), PROJECTIONS) ~> CONT
331331
=>
332-
#projectedUpdate(makeProjectedUpdate(toLocal(I), OLDLOCAL, PROJECTIONS, .Contexts, true, STACK, LOCALS), Moved)
332+
#projectedUpdate(makeProjectedUpdate(toLocal(I), OLDLOCAL, PROJECTIONS, .Contexts, STACK, LOCALS), Moved, true)
333333
~> VAL
334334
~> CONT
335335
</k>
@@ -402,12 +402,12 @@ The `#setLocalValue` operation writes a `TypedLocal` value to a given `Place` wi
402402
Write operations to places that include (a chain of) projections are handled by a special rewrite symbol `#projectedUpdate`.
403403

404404
```k
405-
syntax KItem ::= #projectedUpdate ( ProjectedUpdate , TypedLocal )
406-
syntax ProjectedUpdate ::= makeProjectedUpdate(WriteTo, TypedLocal, ProjectionElems, Contexts, Bool, List, List) [function] // total
407-
| ProjectedUpdate(WriteTo, Contexts, Bool)
405+
syntax KItem ::= #projectedUpdate ( ProjectedUpdate , TypedLocal , Bool )
406+
syntax ProjectedUpdate ::= makeProjectedUpdate(WriteTo, TypedLocal, ProjectionElems, Contexts, List, List) [function] // total
407+
| ProjectedUpdate(WriteTo, Contexts)
408408
409409
rule <k> #setLocalValue(place(local(I), PROJ), VAL)
410-
=> #projectedUpdate(makeProjectedUpdate(toLocal(I), {LOCALS[I]}:>TypedLocal, PROJ, .Contexts, false, STACK, LOCALS), VAL)
410+
=> #projectedUpdate(makeProjectedUpdate(toLocal(I), {LOCALS[I]}:>TypedLocal, PROJ, .Contexts, STACK, LOCALS), VAL, false)
411411
...
412412
</k>
413413
<stack> STACK </stack>
@@ -448,69 +448,63 @@ The solution is to use rewrite operations in a downward pass through the project
448448
=> #buildUpdate(typedValue(Range(ELEMS[I <- VAL]), TY, mutabilityMut), CTXS)
449449
[preserves-definedness] // valid list indexing checked upon context construction
450450
451-
rule makeProjectedUpdate(DEST, typedValue(Aggregate(IDX, ARGS), TY, MUT), projectionElemField(fieldIdx(I), _) PROJS, CTXTS, FORCE, STACK, LOCALS)
452-
=> makeProjectedUpdate(DEST, {ARGS[I]}:>TypedLocal, PROJS, CtxField(TY, IDX, ARGS, I) CTXTS, FORCE, STACK, LOCALS)
451+
rule makeProjectedUpdate(DEST, typedValue(Aggregate(IDX, ARGS), TY, _), projectionElemField(fieldIdx(I), _) PROJS, CTXTS, STACK, LOCALS)
452+
=> makeProjectedUpdate(DEST, {ARGS[I]}:>TypedLocal, PROJS, CtxField(TY, IDX, ARGS, I) CTXTS, STACK, LOCALS)
453453
requires 0 <=Int I
454454
andBool I <Int size(ARGS)
455455
andBool isTypedLocal(ARGS[I])
456-
andBool (FORCE orBool MUT ==K mutabilityMut)
457456
[preserves-definedness] // valid list indexing checked
458457
459-
rule makeProjectedUpdate(DEST, typedValue(Range(ELEMENTS), TY, MUT), projectionElemIndex(local(LOCAL)) PROJS, CTXTS, FORCE, STACK, LOCALS)
460-
=> makeProjectedUpdate(DEST, {ELEMENTS[#expectUsize({LOCALS[LOCAL]}:>TypedValue)]}:>TypedValue, PROJS, CtxIndex(TY, ELEMENTS, #expectUsize({LOCALS[LOCAL]}:>TypedValue)) CTXTS, FORCE, STACK, LOCALS)
458+
rule makeProjectedUpdate(DEST, typedValue(Range(ELEMENTS), TY, _), projectionElemIndex(local(LOCAL)) PROJS, CTXTS, STACK, LOCALS)
459+
=> makeProjectedUpdate(DEST, {ELEMENTS[#expectUsize({LOCALS[LOCAL]}:>TypedValue)]}:>TypedValue, PROJS, CtxIndex(TY, ELEMENTS, #expectUsize({LOCALS[LOCAL]}:>TypedValue)) CTXTS, STACK, LOCALS)
461460
requires 0 <=Int LOCAL
462461
andBool LOCAL <Int size(LOCALS)
463462
andBool isTypedValue(LOCALS[LOCAL])
464463
andBool isInt(#expectUsize({LOCALS[LOCAL]}:>TypedValue))
465464
andBool 0 <=Int #expectUsize({LOCALS[LOCAL]}:>TypedValue)
466465
andBool #expectUsize({LOCALS[LOCAL]}:>TypedValue) <Int size(ELEMENTS)
467466
andBool isTypedValue(ELEMENTS[#expectUsize({LOCALS[LOCAL]}:>TypedValue)])
468-
andBool (FORCE orBool MUT ==K mutabilityMut)
469467
[preserves-definedness] // index checked, valid Int can be read, ELEMENT indexable and writeable or forced
470468
471-
rule makeProjectedUpdate(DEST, typedValue(Range(ELEMENTS), TY, MUT), projectionElemConstantIndex(OFFSET:Int, _MINLEN, false) PROJS, CTXTS, FORCE, STACK, LOCALS)
472-
=> makeProjectedUpdate(DEST, {ELEMENTS[OFFSET]}:>TypedValue, PROJS, CtxIndex(TY, ELEMENTS, OFFSET) CTXTS, FORCE, STACK, LOCALS)
469+
rule makeProjectedUpdate(DEST, typedValue(Range(ELEMENTS), TY, _), projectionElemConstantIndex(OFFSET:Int, _MINLEN, false) PROJS, CTXTS, STACK, LOCALS)
470+
=> makeProjectedUpdate(DEST, {ELEMENTS[OFFSET]}:>TypedValue, PROJS, CtxIndex(TY, ELEMENTS, OFFSET) CTXTS, STACK, LOCALS)
473471
requires 0 <=Int OFFSET
474472
andBool OFFSET <Int size(ELEMENTS)
475473
andBool isTypedValue(ELEMENTS[OFFSET])
476-
andBool (FORCE orBool MUT ==K mutabilityMut)
477474
[preserves-definedness] // ELEMENT indexable and writeable or forced
478475
479-
rule makeProjectedUpdate(DEST, typedValue(Range(ELEMENTS), TY, MUT), projectionElemConstantIndex(OFFSET:Int, MINLEN, true) PROJS, CTXTS, FORCE, STACK, LOCALS)
480-
=> makeProjectedUpdate(DEST, {ELEMENTS[OFFSET]}:>TypedValue, PROJS, CtxIndex(TY, ELEMENTS, MINLEN -Int OFFSET) CTXTS, FORCE, STACK, LOCALS)
476+
rule makeProjectedUpdate(DEST, typedValue(Range(ELEMENTS), TY, _), projectionElemConstantIndex(OFFSET:Int, MINLEN, true) PROJS, CTXTS, STACK, LOCALS)
477+
=> makeProjectedUpdate(DEST, {ELEMENTS[OFFSET]}:>TypedValue, PROJS, CtxIndex(TY, ELEMENTS, MINLEN -Int OFFSET) CTXTS, STACK, LOCALS)
481478
requires 0 <Int OFFSET
482479
andBool OFFSET <=Int MINLEN
483480
andBool MINLEN ==Int size(ELEMENTS) // assumed for valid MIR code
484481
andBool isTypedValue(ELEMENTS[MINLEN -Int OFFSET])
485-
andBool (FORCE orBool MUT ==K mutabilityMut)
486482
[preserves-definedness] // ELEMENT indexable and writeable or forced
487483
488-
rule makeProjectedUpdate(_DEST, typedValue(Reference(OFFSET, place(LOCAL, PLACEPROJ), MUT), _, _), projectionElemDeref PROJS, _CTXTS, FORCE, STACK, LOCALS)
489-
=> makeProjectedUpdate(toStack(OFFSET, LOCAL), #localFromFrame({STACK[OFFSET -Int 1]}:>StackFrame, LOCAL, OFFSET), appendP(PLACEPROJ, PROJS), .Contexts, FORCE, STACK, LOCALS)
484+
rule makeProjectedUpdate(_DEST, typedValue(Reference(OFFSET, place(LOCAL, PLACEPROJ), _), _, _), projectionElemDeref PROJS, _CTXTS, STACK, LOCALS)
485+
=> makeProjectedUpdate(toStack(OFFSET, LOCAL), #localFromFrame({STACK[OFFSET -Int 1]}:>StackFrame, LOCAL, OFFSET), appendP(PLACEPROJ, PROJS), .Contexts, STACK, LOCALS)
490486
requires 0 <Int OFFSET
491487
andBool OFFSET <=Int size(STACK)
492488
andBool isStackFrame(STACK[OFFSET -Int 1])
493-
andBool (FORCE orBool MUT ==K mutabilityMut)
494489
[preserves-definedness]
495490
496-
rule makeProjectedUpdate(_DEST, typedValue(Reference(OFFSET, place(local(I), PLACEPROJ), MUT), _, _), projectionElemDeref PROJS, _CTXTS, FORCE, STACK, LOCALS)
497-
=> makeProjectedUpdate(toLocal(I), {LOCALS[I]}:>TypedLocal, appendP(PLACEPROJ, PROJS), .Contexts, FORCE, STACK, LOCALS)
491+
rule makeProjectedUpdate(_DEST, typedValue(Reference(OFFSET, place(local(I), PLACEPROJ), _), _, _), projectionElemDeref PROJS, _CTXTS, STACK, LOCALS)
492+
=> makeProjectedUpdate(toLocal(I), {LOCALS[I]}:>TypedLocal, appendP(PLACEPROJ, PROJS), .Contexts, STACK, LOCALS)
498493
requires OFFSET ==Int 0
499494
andBool 0 <=Int I
500495
andBool I <Int size(LOCALS)
501-
andBool (FORCE orBool MUT ==K mutabilityMut)
502496
[preserves-definedness]
503497
504-
rule makeProjectedUpdate(DEST, _:TypedValue, .ProjectionElems, CONTEXTS, FORCE, _, _)
505-
=> ProjectedUpdate(DEST, CONTEXTS, FORCE)
498+
rule makeProjectedUpdate(DEST, _:TypedValue, .ProjectionElems, CONTEXTS, _, _)
499+
=> ProjectedUpdate(DEST, CONTEXTS)
506500
507-
rule <k> #projectedUpdate(ProjectedUpdate(toLocal(I), CONTEXTS, false), NEW)
501+
rule <k> #projectedUpdate(ProjectedUpdate(toLocal(I), CONTEXTS), NEW, false)
508502
=> #setLocalValue(place(local(I), .ProjectionElems), #buildUpdate(NEW, CONTEXTS))
509503
...
510504
</k>
511505
[preserves-definedness] // valid conmtext ensured upon context construction
512506
513-
rule <k> #projectedUpdate(ProjectedUpdate(toLocal(I), CONTEXTS, true), NEW)
507+
rule <k> #projectedUpdate(ProjectedUpdate(toLocal(I), CONTEXTS), NEW, true)
514508
=> #forceSetLocal(local(I), #buildUpdate(NEW, CONTEXTS))
515509
...
516510
</k>
@@ -525,7 +519,7 @@ The solution is to use rewrite operations in a downward pass through the project
525519
andBool I <Int size(LOCALS)
526520
[preserves-definedness] // valid list indexing checked
527521
528-
rule <k> #projectedUpdate(ProjectedUpdate(toStack(FRAME, local(I)), CONTEXTS, _), NEW) => .K ... </k>
522+
rule <k> #projectedUpdate(ProjectedUpdate(toStack(FRAME, local(I)), CONTEXTS), NEW, _) => .K ... </k>
529523
<stack> STACK => STACK[(FRAME -Int 1) <- #updateStackLocal({STACK[FRAME -Int 1]}:>StackFrame, I, #buildUpdate(NEW, CONTEXTS)) ] </stack>
530524
requires 0 <Int FRAME
531525
andBool FRAME <=Int size(STACK)

0 commit comments

Comments
 (0)