Skip to content

Commit

Permalink
Remove flag from %StackValue (#721)
Browse files Browse the repository at this point in the history
This special flag annoyed me, so here is a version with pointer
comparisons instead.
  • Loading branch information
serkm authored Dec 4, 2024
1 parent f5e840e commit 4e6d325
Showing 1 changed file with 44 additions and 65 deletions.
109 changes: 44 additions & 65 deletions libraries/llvm/rts.ll
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@
; This is used for two purposes:
; - a refied first-class list of stacks (cyclic linked-list)
; - as part of an intrusive linked-list of stacks (meta stack)
%StackValue = type { %ReferenceCount, %Memory, %Prompt, i1, %Stack }
%StackValue = type { %ReferenceCount, %Memory, %Prompt, %Stack }



Expand Down Expand Up @@ -336,7 +336,7 @@ define private %Stack @reset(%Stack %oldStack) {

%stack.0 = insertvalue %StackValue zeroinitializer, %Memory %stackMemory, 1
%stack.1 = insertvalue %StackValue %stack.0, %Prompt %prompt, 2
%stack.2 = insertvalue %StackValue %stack.1, %Stack %oldStack, 4
%stack.2 = insertvalue %StackValue %stack.1, %Stack %oldStack, 3

store %StackValue %stack.2, %Stack %stack

Expand All @@ -347,59 +347,55 @@ define private %Stack @reset(%Stack %oldStack) {
}

define private void @updatePrompts(%Stack %stack) {
%dirtyBit_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 3
%dirtyBit = load i1, ptr %dirtyBit_pointer
br i1 %dirtyBit, label %continue, label %done
%prompt_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 2
%prompt = load %Prompt, ptr %prompt_pointer
%stack_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 1
%promptStack = load %Stack, ptr %stack_pointer
%isThis = icmp eq %Stack %promptStack, %stack
br i1 %isThis, label %done, label %continue

done:
ret void

continue:
%prompt_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 2
%prompt = load %Prompt, ptr %prompt_pointer
%stack_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 1
%promptStack = load %Stack, ptr %stack_pointer
%isOccupied = icmp ne %Stack %promptStack, null
br i1 %isOccupied, label %displace, label %update

displace:
call void @displace(%Stack %promptStack)
call void @displace(%Stack %promptStack, %Stack %promptStack)
br label %update

update:
store %Stack %stack, ptr %stack_pointer
store i1 0, ptr %dirtyBit_pointer

%next_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 4
%next_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 3
%next = load %Stack, ptr %next_pointer
tail call void @updatePrompts(%Stack %next)
ret void
}

define void @displace(%Stack %stack) {
define void @displace(%Stack %stack, %Stack %end) {
%prompt_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 2
%next_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 4
%dirtyBit_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 3
%dirtyBit = load i1, ptr %dirtyBit_pointer
br i1 %dirtyBit, label %done, label %continue

done:
ret void

continue:
%next_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 3
%prompt = load %Prompt, ptr %prompt_pointer
%stack_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 1
store %Stack null, ptr %stack_pointer
store i1 1, ptr %dirtyBit_pointer

%next = load %Stack, ptr %next_pointer
tail call void @displace(%Stack %next)
%isEnd = icmp eq %Stack %next, %end
br i1 %isEnd, label %done, label %continue

done:
ret void

continue:
tail call void @displace(%Stack %next, %Stack %end)
ret void
}

define %Stack @resume(%Resumption %resumption, %Stack %oldStack) {
%uniqueResumption = call %Resumption @uniqueStack(%Resumption %resumption)
%rest_pointer = getelementptr %StackValue, %Resumption %uniqueResumption, i64 0, i32 4
%rest_pointer = getelementptr %StackValue, %Resumption %uniqueResumption, i64 0, i32 3
%start = load %Stack, ptr %rest_pointer
call void @updatePrompts(%Stack %start)

Expand All @@ -411,7 +407,7 @@ define %Stack @resume(%Resumption %resumption, %Stack %oldStack) {
define private {%Resumption, %Stack} @shift(%Stack %stack, %Prompt %prompt) {
%resumpion_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 1
%resumption = load %Stack, ptr %resumpion_pointer
%next_pointer = getelementptr %StackValue, %Stack %resumption, i64 0, i32 4
%next_pointer = getelementptr %StackValue, %Stack %resumption, i64 0, i32 3
%next = load %Stack, ptr %next_pointer

store %Stack %stack, ptr %next_pointer
Expand All @@ -427,31 +423,7 @@ define private void @eraseMemory(%Memory %memory) {
ret void
}

define private void @forEachObject(ptr %elementPointer, ptr %end, ptr %f) alwaysinline {
%done = icmp uge ptr %elementPointer, %end
br i1 %done, label %return, label %erase

erase:
%element = load %Pos, ptr %elementPointer
call void %f(%Pos %element)

%nextElementPointer = getelementptr %Pos, ptr %elementPointer, i64 1
tail call void @forEachObject(ptr %nextElementPointer, ptr %end, ptr %f)
ret void

return:
ret void
}

define void @erasePrompt(%Prompt %prompt, i1 %dirtyBit) alwaysinline {
br i1 %dirtyBit, label %continue, label %clearPrompt

clearPrompt:
%stack_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 1
store %Stack null, ptr %stack_pointer
br label %continue

continue:
define void @erasePrompt(%Prompt %prompt) alwaysinline {
%referenceCount_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 0
%referenceCount = load %ReferenceCount, ptr %referenceCount_pointer
switch %ReferenceCount %referenceCount, label %decrement [%ReferenceCount 0, label %free]
Expand All @@ -477,16 +449,17 @@ define void @sharePrompt(%Prompt %prompt) alwaysinline {
define private %Stack @underflowStack(%Stack %stack) {
%stackMemory = getelementptr %StackValue, %Stack %stack, i64 0, i32 1
%stackPrompt = getelementptr %StackValue, %Stack %stack, i64 0, i32 2
%stackDirtyBit = getelementptr %StackValue, %Stack %stack, i64 0, i32 3
%stackRest = getelementptr %StackValue, %Stack %stack, i64 0, i32 4
%stackRest = getelementptr %StackValue, %Stack %stack, i64 0, i32 3

%memory = load %Memory, ptr %stackMemory
%prompt = load %Prompt, ptr %stackPrompt
%rest = load %Stack, ptr %stackRest
%dirtyBit = load i1, ptr %stackDirtyBit

%promptStack_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 1
store %Stack null, ptr %promptStack_pointer

call void @eraseMemory(%Memory %memory)
call void @erasePrompt(%Prompt %prompt, i1 false)
call void @erasePrompt(%Prompt %prompt)
call void @free(%Stack %stack)

ret %Stack %rest
Expand Down Expand Up @@ -537,7 +510,7 @@ done:
copy:
%newOldReferenceCount = sub %ReferenceCount %referenceCount, 1
store %ReferenceCount %newOldReferenceCount, ptr %referenceCount_pointer
%stack_pointer = getelementptr %StackValue, %Resumption %resumption, i64 0, i32 4
%stack_pointer = getelementptr %StackValue, %Resumption %resumption, i64 0, i32 3
%stack = load %Stack, ptr %stack_pointer

%size = ptrtoint ptr getelementptr (%StackValue, ptr null, i64 1) to i64
Expand All @@ -551,7 +524,7 @@ loop:

%stackMemory = getelementptr %StackValue, %Stack %old, i64 0, i32 1
%stackPrompt = getelementptr %StackValue, %Stack %old, i64 0, i32 2
%stackRest = getelementptr %StackValue, %Stack %old, i64 0, i32 4
%stackRest = getelementptr %StackValue, %Stack %old, i64 0, i32 3

%memory = load %Memory, ptr %stackMemory
%prompt = load %Prompt, ptr %stackPrompt
Expand All @@ -560,8 +533,7 @@ loop:
%newStackReferenceCounter = getelementptr %StackValue, %Stack %newStack, i64 0, i32 0
%newStackMemory = getelementptr %StackValue, %Stack %newStack, i64 0, i32 1
%newStackPrompt = getelementptr %StackValue, %Stack %newStack, i64 0, i32 2
%newStackDirtyBit = getelementptr %StackValue, %Stack %newStack, i64 0, i32 3
%newStackRest = getelementptr %StackValue, %Stack %newStack, i64 0, i32 4
%newStackRest = getelementptr %StackValue, %Stack %newStack, i64 0, i32 3

%newMemory = call %Memory @copyMemory(%Memory %memory)

Expand All @@ -573,7 +545,6 @@ loop:
store %ReferenceCount 0, ptr %newStackReferenceCounter
store %Memory %newMemory, ptr %newStackMemory
store %Prompt %prompt, ptr %newStackPrompt
store i1 1, ptr %newStackDirtyBit

%isEnd = icmp eq %Stack %old, %resumption
br i1 %isEnd, label %stop, label %next
Expand Down Expand Up @@ -607,7 +578,7 @@ define void @eraseResumption(%Resumption %resumption) alwaysinline {
ret void

free:
%stack_pointer = getelementptr %StackValue, %Resumption %resumption, i64 0, i32 4
%stack_pointer = getelementptr %StackValue, %Resumption %resumption, i64 0, i32 3
%stack = load %Stack, ptr %stack_pointer
store %Stack null, ptr %stack_pointer
call void @eraseStack(%Stack %stack)
Expand All @@ -617,17 +588,25 @@ define void @eraseResumption(%Resumption %resumption) alwaysinline {
define void @eraseStack(%Stack %stack) alwaysinline {
%stackPointer_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 1, i32 0
%prompt_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 2
%dirtyBit_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 3
%rest_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 4
%rest_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 3

%stackPointer = load %StackPointer, ptr %stackPointer_pointer
%prompt = load %Stack, ptr %prompt_pointer
%dirtyBit = load i1, ptr %dirtyBit_pointer
%rest = load %Stack, ptr %rest_pointer

%promptStack_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 1
%promptStack = load %Stack, ptr %promptStack_pointer
%isThisStack = icmp eq %Stack %promptStack, %stack
br i1 %isThisStack, label %clearPrompt, label %free

clearPrompt:
store %Stack null, ptr %promptStack_pointer
br label %free

free:
call void @free(%Stack %stack)
call void @eraseFrames(%StackPointer %stackPointer)
call void @erasePrompt(%Prompt %prompt, i1 %dirtyBit)
call void @erasePrompt(%Prompt %prompt)

%isNull = icmp eq %Stack %rest, null
br i1 %isNull, label %done, label %next
Expand Down

0 comments on commit 4e6d325

Please sign in to comment.