diff --git a/libraries/llvm/rts.ll b/libraries/llvm/rts.ll index cb961d517..301b7b543 100644 --- a/libraries/llvm/rts.ll +++ b/libraries/llvm/rts.ll @@ -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 } @@ -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 @@ -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) @@ -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 @@ -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] @@ -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 @@ -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 @@ -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 @@ -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) @@ -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 @@ -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) @@ -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