Skip to content

Commit b6f26ef

Browse files
committed
Assume uniqueness of RC (= 0)
1 parent 7e5beee commit b6f26ef

1 file changed

Lines changed: 10 additions & 5 deletions

File tree

libraries/llvm/rts.ll

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ declare double @tan(double)
117117
declare void @print(i64)
118118
declare void @exit(i64)
119119
declare void @llvm.assume(i1)
120+
declare i64 @llvm.expect.i64(i64, i64)
120121

121122

122123
; Prompts
@@ -187,7 +188,8 @@ define private void @eraseObject(%Object %object) alwaysinline {
187188
next:
188189
%objectReferenceCount = getelementptr %Header, ptr %object, i64 0, i32 0
189190
%referenceCount = load %ReferenceCount, ptr %objectReferenceCount, !alias.scope !14, !noalias !24
190-
switch %ReferenceCount %referenceCount, label %decr [%ReferenceCount 0, label %free]
191+
%expectedRC = call i64 @llvm.expect.i64(i64 %referenceCount, i64 0) ; assume uniqueness
192+
switch %ReferenceCount %expectedRC, label %decr [%ReferenceCount 0, label %free]
191193

192194
decr:
193195
%referenceCount.1 = sub %ReferenceCount %referenceCount, 1
@@ -449,7 +451,8 @@ define private {%Resumption, %Stack} @shift(%Stack %stack, %Prompt %prompt) {
449451
define private void @erasePrompt(%Prompt %prompt) alwaysinline {
450452
%referenceCount_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 0
451453
%referenceCount = load %ReferenceCount, ptr %referenceCount_pointer, !alias.scope !13, !noalias !23
452-
switch %ReferenceCount %referenceCount, label %decrement [%ReferenceCount 0, label %free]
454+
%expectedRC = call i64 @llvm.expect.i64(i64 %referenceCount, i64 0) ; assume uniqueness
455+
switch %ReferenceCount %expectedRC, label %decrement [%ReferenceCount 0, label %free]
453456

454457
decrement:
455458
%newReferenceCount = sub %ReferenceCount %referenceCount, 1
@@ -532,7 +535,8 @@ define private %Resumption @uniqueStack(%Resumption %resumption) alwaysinline {
532535
entry:
533536
%referenceCount_pointer = getelementptr %StackValue, %Resumption %resumption, i64 0, i32 0
534537
%referenceCount = load %ReferenceCount, ptr %referenceCount_pointer, !alias.scope !11, !noalias !21
535-
switch %ReferenceCount %referenceCount, label %copy [%ReferenceCount 0, label %done]
538+
%expectedRC = call i64 @llvm.expect.i64(i64 %referenceCount, i64 0) ; assume uniqueness
539+
switch %ReferenceCount %expectedRC, label %copy [%ReferenceCount 0, label %done]
536540

537541
done:
538542
ret %Resumption %resumption
@@ -584,7 +588,8 @@ define void @shareResumption(%Resumption %resumption) alwaysinline {
584588
define void @eraseResumption(%Resumption %resumption) alwaysinline {
585589
%referenceCount_pointer = getelementptr %StackValue, %Resumption %resumption, i64 0, i32 0
586590
%referenceCount = load %ReferenceCount, ptr %referenceCount_pointer, !alias.scope !11, !noalias !21
587-
switch %ReferenceCount %referenceCount, label %decr [%ReferenceCount 0, label %free]
591+
%expectedRC = call i64 @llvm.expect.i64(i64 %referenceCount, i64 0) ; assume uniqueness
592+
switch %ReferenceCount %expectedRC, label %decr [%ReferenceCount 0, label %free]
588593

589594
decr:
590595
%referenceCount.1 = sub %ReferenceCount %referenceCount, 1
@@ -817,4 +822,4 @@ define ccc %Double @coercePosDouble(%Pos %input) {
817822
!22 = !{!1, !3, !4, !5} ; not stackPointer
818823
!23 = !{!1, !2, !4, !5} ; not prompt
819824
!24 = !{!1, !2, !3, !5} ; not object
820-
!25 = !{!1, !2, !3, !4 } ; not vtable
825+
!25 = !{!1, !2, !3, !4 } ; not vtable

0 commit comments

Comments
 (0)