@@ -117,6 +117,7 @@ declare double @tan(double)
117117declare void @print (i64 )
118118declare void @exit (i64 )
119119declare 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) {
449451define 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
454457decrement:
455458 %newReferenceCount = sub %ReferenceCount %referenceCount , 1
@@ -532,7 +535,8 @@ define private %Resumption @uniqueStack(%Resumption %resumption) alwaysinline {
532535entry:
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
537541done:
538542 ret %Resumption %resumption
@@ -584,7 +588,8 @@ define void @shareResumption(%Resumption %resumption) alwaysinline {
584588define 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