Skip to content

Commit 5f26c54

Browse files
serkmphischu
andauthored
Store StackValues in the actual stack (#808)
This reduces allocations and an indirection. It seems to eliminate the computation in `factorial_accumulator` for some reason. I guess llvm has enough info to remove dead code here. ![image](https://github.com/user-attachments/assets/83267813-259c-4a62-b140-cabb2fd6ca52) --------- Co-authored-by: phischu <[email protected]>
1 parent 6b2b191 commit 5f26c54

File tree

2 files changed

+144
-145
lines changed

2 files changed

+144
-145
lines changed

effekt/shared/src/main/scala/effekt/generator/llvm/Transformer.scala

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,7 @@ object Transformer {
516516
loadEnvironmentAt(nextStackPointer, freshEnvironment);
517517

518518
eraseValues(freshEnvironment, Set());
519-
val next = if (kind == StackEraser) free else eraseFrames // TODO: improve this (in RTS?)
519+
val next = if (kind == StackEraser) freeStack else eraseFrames // TODO: improve this (in RTS?)
520520
emit(Call("_", Ccc(), VoidType(), next, List(nextStackPointer)));
521521
RetVoid()
522522
};
@@ -580,19 +580,26 @@ object Transformer {
580580
}
581581

582582
def pushFrameOnto(stack: Operand, environment: machine.Environment, returnAddressName: String, sharer: Operand, eraser: Operand)(using ModuleContext, FunctionContext, BlockContext) = {
583-
val stackPointer = LocalReference(stackPointerType, freshName("stackPointer"));
584-
val size = ConstantInt(environmentSize(environment) + 24);
585-
emit(Call(stackPointer.name, Ccc(), stackPointer.tpe, stackAllocate, List(stack, size)));
583+
val size = environmentSize(environment);
584+
585+
val newStack = LocalReference(stackType, freshName("stack"))
586+
emit(Call(newStack.name, Ccc(), stackType, checkLimit, List(stack, ConstantInt(size + 24))));
587+
setStack(newStack);
588+
589+
val environmentPointer = LocalReference(stackPointerType, freshName("environmentPointer"));
590+
emit(Call(environmentPointer.name, Ccc(), stackPointerType, stackAllocate, List(newStack, ConstantInt(size))));
586591

587-
val frameType = StructureType(List(environmentType(environment), frameHeaderType));
588-
storeEnvironmentAt(stackPointer, environment);
592+
storeEnvironmentAt(environmentPointer, environment);
593+
594+
val headerPointer = LocalReference(stackPointerType, freshName("headerPointer"));
595+
emit(Call(headerPointer.name, Ccc(), stackPointerType, stackAllocate, List(newStack, ConstantInt(24))));
589596

590597
val returnAddressPointer = LocalReference(PointerType(), freshName("returnAddress_pointer"));
591-
emit(GetElementPtr(returnAddressPointer.name, frameType, stackPointer, List(0, 1, 0)));
598+
emit(GetElementPtr(returnAddressPointer.name, frameHeaderType, headerPointer, List(0, 0)));
592599
val sharerPointer = LocalReference(PointerType(), freshName("sharer_pointer"));
593-
emit(GetElementPtr(sharerPointer.name, frameType, stackPointer, List(0, 1, 1)));
600+
emit(GetElementPtr(sharerPointer.name, frameHeaderType, headerPointer, List(0, 1)));
594601
val eraserPointer = LocalReference(PointerType(), freshName("eraser_pointer"));
595-
emit(GetElementPtr(eraserPointer.name, frameType, stackPointer, List(0, 1, 2)));
602+
emit(GetElementPtr(eraserPointer.name, frameHeaderType, headerPointer, List(0, 2)));
596603

597604
emit(Store(returnAddressPointer, ConstantGlobal(returnAddressName)));
598605
emit(Store(sharerPointer, sharer));
@@ -706,6 +713,8 @@ object Transformer {
706713
val eraseResumption = ConstantGlobal("eraseResumption");
707714
val eraseFrames = ConstantGlobal("eraseFrames");
708715

716+
val freeStack = ConstantGlobal("freeStack")
717+
709718
val alloc = ConstantGlobal("alloc")
710719
val getPointer = ConstantGlobal("getPointer")
711720

@@ -719,6 +728,7 @@ object Transformer {
719728
val underflowStack = ConstantGlobal("underflowStack");
720729
val uniqueStack = ConstantGlobal("uniqueStack");
721730
val withEmptyStack = ConstantGlobal("withEmptyStack");
731+
val checkLimit = ConstantGlobal("checkLimit")
722732
val stackAllocate = ConstantGlobal("stackAllocate");
723733
val stackDeallocate = ConstantGlobal("stackDeallocate");
724734

0 commit comments

Comments
 (0)