Skip to content

Commit f7d7276

Browse files
authored
Add alias information for prompts (#825)
1 parent e131cdb commit f7d7276

File tree

2 files changed

+34
-31
lines changed

2 files changed

+34
-31
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,12 @@ ${indentedLines(instructions.map(show).mkString("\n"))}
7272
C.abort(s"tail call to non-void function returning: $tpe")
7373

7474
case Load(result, tpe, LocalReference(PointerType(), name)) =>
75-
s"${localName(result)} = load ${show(tpe)}, ${show(LocalReference(PointerType(), name))}, !noalias !2"
75+
s"${localName(result)} = load ${show(tpe)}, ${show(LocalReference(PointerType(), name))}, !noalias !5"
7676
case Load(_, _, operand) => C.abort(s"WIP: loading anything but local references not yet implemented: $operand")
7777

7878
// TODO [jfrech, 2022-07-26] Why does `Load` explicitly check for a local reference and `Store` does not?
7979
case Store(address, value) =>
80-
s"store ${show(value)}, ${show(address)}, !noalias !2"
80+
s"store ${show(value)}, ${show(address)}, !noalias !5"
8181

8282
case GetElementPtr(result, tpe, ptr @ LocalReference(_, name), i :: is) =>
8383
s"${localName(result)} = getelementptr ${show(tpe)}, ${show(ptr)}, i64 $i" + is.map(", i32 " + _).mkString

libraries/llvm/rts.ll

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ define private %Prompt @currentPrompt(%Stack %stack) {
151151
define private %Prompt @freshPrompt() {
152152
%promptSize = ptrtoint ptr getelementptr (%PromptValue, ptr null, i64 1) to i64
153153
%prompt = call %Prompt @malloc(i64 %promptSize)
154-
store %PromptValue zeroinitializer, %Prompt %prompt
154+
store %PromptValue zeroinitializer, %Prompt %prompt, !alias.scope !4
155155
ret %Prompt %prompt
156156
}
157157

@@ -244,7 +244,7 @@ define void @eraseNegative(%Neg %val) alwaysinline {
244244

245245
define private %Stack @getStack(%Prompt %prompt) {
246246
%stack_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 1
247-
%stack = load %Stack, ptr %stack_pointer
247+
%stack = load %Stack, ptr %stack_pointer, !alias.scope !4
248248
ret %Stack %stack
249249
}
250250

@@ -280,8 +280,8 @@ define private %Stack @checkLimit(%Stack %stack, i64 %n) alwaysinline {
280280
%stackPointer_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 1
281281
%limit_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 2
282282

283-
%currentStackPointer = load %StackPointer, ptr %stackPointer_pointer, !alias.scope !2
284-
%limit = load %Limit, ptr %limit_pointer, !alias.scope !2
283+
%currentStackPointer = load %StackPointer, ptr %stackPointer_pointer, !alias.scope !3
284+
%limit = load %Limit, ptr %limit_pointer, !alias.scope !3
285285
%nextStackPointer = getelementptr i8, %StackPointer %currentStackPointer, i64 %n
286286
%isInside = icmp ule %StackPointer %nextStackPointer, %limit
287287
br i1 %isInside, label %done, label %realloc
@@ -304,13 +304,13 @@ realloc:
304304
%newStackPointer_pointer = getelementptr %StackValue, %Stack %newStack, i64 0, i32 1
305305
%newLimit_pointer = getelementptr %StackValue, %Stack %newStack, i64 0, i32 2
306306

307-
store %StackPointer %newStackPointer, ptr %newStackPointer_pointer, !alias.scope !2
308-
store %Limit %newLimit, ptr %newLimit_pointer, !alias.scope !2
307+
store %StackPointer %newStackPointer, ptr %newStackPointer_pointer, !alias.scope !3
308+
store %Limit %newLimit, ptr %newLimit_pointer, !alias.scope !3
309309

310310
%prompt_pointer = getelementptr %StackValue, %Stack %newStack, i64 0, i32 3
311311
%prompt = load %Prompt, ptr %prompt_pointer
312312
%promptStack = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 1
313-
store %Stack %newStack, ptr %promptStack
313+
store %Stack %newStack, ptr %promptStack, !alias.scope !4
314314

315315
ret %Stack %newStack
316316
}
@@ -319,26 +319,26 @@ define private %StackPointer @stackAllocate(%Stack %stack, i64 %n) alwaysinline
319319
%stackPointer_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 1
320320
%limit_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 2
321321

322-
%currentStackPointer = load %StackPointer, ptr %stackPointer_pointer, !alias.scope !2
323-
%limit = load %Limit, ptr %limit_pointer, !alias.scope !2
322+
%currentStackPointer = load %StackPointer, ptr %stackPointer_pointer, !alias.scope !3
323+
%limit = load %Limit, ptr %limit_pointer, !alias.scope !3
324324
%nextStackPointer = getelementptr i8, %StackPointer %currentStackPointer, i64 %n
325325

326-
store %StackPointer %nextStackPointer, ptr %stackPointer_pointer, !alias.scope !2
326+
store %StackPointer %nextStackPointer, ptr %stackPointer_pointer, !alias.scope !3
327327
ret %StackPointer %currentStackPointer
328328
}
329329

330330
define private %StackPointer @stackDeallocate(%Stack %stack, i64 %n) {
331331
%stackPointer_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 1
332-
%stackPointer = load %StackPointer, ptr %stackPointer_pointer, !alias.scope !2
332+
%stackPointer = load %StackPointer, ptr %stackPointer_pointer, !alias.scope !3
333333

334334
%limit_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 2
335-
%limit = load %Limit, ptr %limit_pointer, !alias.scope !2
335+
%limit = load %Limit, ptr %limit_pointer, !alias.scope !3
336336
%isInside = icmp ule %StackPointer %stackPointer, %limit
337337
call void @llvm.assume(i1 %isInside)
338338

339339
%o = sub i64 0, %n
340340
%newStackPointer = getelementptr i8, %StackPointer %stackPointer, i64 %o
341-
store %StackPointer %newStackPointer, ptr %stackPointer_pointer, !alias.scope !2
341+
store %StackPointer %newStackPointer, ptr %stackPointer_pointer, !alias.scope !3
342342

343343
ret %StackPointer %newStackPointer
344344
}
@@ -352,11 +352,11 @@ define private i64 @nextPowerOfTwo(i64 %x) {
352352

353353
define private void @assumeFrameHeaderWasPopped(%Stack %stack) alwaysinline {
354354
%stackPointer_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 1
355-
%stackPointer = load %StackPointer, ptr %stackPointer_pointer, !alias.scope !2
355+
%stackPointer = load %StackPointer, ptr %stackPointer_pointer, !alias.scope !3
356356
%oldStackPointer = getelementptr %FrameHeader, %StackPointer %stackPointer, i64 1
357357

358358
%limit_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 2
359-
%limit = load %Limit, ptr %limit_pointer, !alias.scope !2
359+
%limit = load %Limit, ptr %limit_pointer, !alias.scope !3
360360
%isInside = icmp ule %StackPointer %oldStackPointer, %limit
361361
call void @llvm.assume(i1 %isInside)
362362
ret void
@@ -381,7 +381,7 @@ define private %Stack @reset(%Stack %oldStack) {
381381
store %StackValue %stack.3, %Stack %stack
382382

383383
%promptStack = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 1
384-
store %Stack %stack, ptr %promptStack
384+
store %Stack %stack, ptr %promptStack, !alias.scope !4
385385

386386
ret %Stack %stack
387387
}
@@ -390,7 +390,7 @@ define private void @revalidate(%Stack %stack) {
390390
%prompt_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 3
391391
%prompt = load %Prompt, ptr %prompt_pointer
392392
%stack_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 1
393-
%promptStack = load %Stack, ptr %stack_pointer
393+
%promptStack = load %Stack, ptr %stack_pointer, !alias.scope !4
394394
%isThis = icmp eq %Stack %promptStack, %stack
395395
br i1 %isThis, label %done, label %continue
396396

@@ -406,7 +406,7 @@ displace:
406406
br label %update
407407

408408
update:
409-
store %Stack %stack, ptr %stack_pointer
409+
store %Stack %stack, ptr %stack_pointer, !alias.scope !4
410410

411411
%next_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 4
412412
%next = load %Stack, ptr %next_pointer
@@ -420,7 +420,7 @@ define private void @invalidate(%Stack %stack, %Stack %end) {
420420
%next_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 4
421421
%prompt = load %Prompt, ptr %prompt_pointer
422422
%stack_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 1
423-
store %Stack null, ptr %stack_pointer
423+
store %Stack null, ptr %stack_pointer, !alias.scope !4
424424

425425
%next = load %Stack, ptr %next_pointer
426426

@@ -456,7 +456,7 @@ define private %Stack @resume(%Resumption %resumption, %Stack %oldStack) {
456456

457457
define private {%Resumption, %Stack} @shift(%Stack %stack, %Prompt %prompt) {
458458
%resumpion_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 1
459-
%resumption = load %Stack, ptr %resumpion_pointer
459+
%resumption = load %Stack, ptr %resumpion_pointer, !alias.scope !4
460460
%next_pointer = getelementptr %StackValue, %Stack %resumption, i64 0, i32 4
461461
%next = load %Stack, ptr %next_pointer
462462

@@ -469,12 +469,12 @@ define private {%Resumption, %Stack} @shift(%Stack %stack, %Prompt %prompt) {
469469

470470
define private void @erasePrompt(%Prompt %prompt) alwaysinline {
471471
%referenceCount_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 0
472-
%referenceCount = load %ReferenceCount, ptr %referenceCount_pointer
472+
%referenceCount = load %ReferenceCount, ptr %referenceCount_pointer, !alias.scope !4
473473
switch %ReferenceCount %referenceCount, label %decrement [%ReferenceCount 0, label %free]
474474

475475
decrement:
476476
%newReferenceCount = sub %ReferenceCount %referenceCount, 1
477-
store %ReferenceCount %newReferenceCount, ptr %referenceCount_pointer
477+
store %ReferenceCount %newReferenceCount, ptr %referenceCount_pointer, !alias.scope !4
478478
ret void
479479

480480
free:
@@ -484,9 +484,9 @@ free:
484484

485485
define private void @sharePrompt(%Prompt %prompt) alwaysinline {
486486
%referenceCount_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 0
487-
%referenceCount = load %ReferenceCount, ptr %referenceCount_pointer
487+
%referenceCount = load %ReferenceCount, ptr %referenceCount_pointer, !alias.scope !4
488488
%newReferenceCount = add %ReferenceCount %referenceCount, 1
489-
store %ReferenceCount %newReferenceCount, ptr %referenceCount_pointer
489+
store %ReferenceCount %newReferenceCount, ptr %referenceCount_pointer, !alias.scope !4
490490
ret void
491491
}
492492

@@ -498,7 +498,7 @@ define private %Stack @underflowStack(%Stack %stack) {
498498
%rest = load %Stack, ptr %stackRest
499499

500500
%promptStack_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 1
501-
store %Stack null, ptr %promptStack_pointer
501+
store %Stack null, ptr %promptStack_pointer, !alias.scope !4
502502

503503
call void @erasePrompt(%Prompt %prompt)
504504
call void @free(%Stack %stack)
@@ -630,12 +630,12 @@ define void @eraseStack(%Stack %stack) alwaysinline {
630630
%rest = load %Stack, ptr %rest_pointer
631631

632632
%promptStack_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 1
633-
%promptStack = load %Stack, ptr %promptStack_pointer
633+
%promptStack = load %Stack, ptr %promptStack_pointer, !alias.scope !4
634634
%isThisStack = icmp eq %Stack %promptStack, %stack
635635
br i1 %isThisStack, label %clearPrompt, label %free
636636

637637
clearPrompt:
638-
store %Stack null, ptr %promptStack_pointer
638+
store %Stack null, ptr %promptStack_pointer, !alias.scope !4
639639
br label %free
640640

641641
free:
@@ -721,7 +721,7 @@ define private %Stack @withEmptyStack() {
721721
%stack = call %Stack @reset(%Stack %globals)
722722

723723
%globalStack = getelementptr %PromptValue, %Prompt @global, i64 0, i32 1
724-
store %Stack %stack, ptr %globalStack
724+
store %Stack %stack, ptr %globalStack, !alias.scope !4
725725

726726
%stackStackPointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 1
727727
%stackPointer = load %StackPointer, ptr %stackStackPointer
@@ -807,6 +807,9 @@ define void @run_Pos(%Neg %f, %Pos %argument) {
807807

808808
; Scopes
809809
!1 = !{!"stackValues", !0}
810+
!2 = !{!"prompts", !0}
810811

811812
; Scope lists
812-
!2 = !{!1}
813+
!3 = !{!1} ; stackValues
814+
!4 = !{!2} ; prompts
815+
!5 = !{!1, !2} ; stackValues & prompts

0 commit comments

Comments
 (0)