Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SR-9427] CharacterLiteralsSmall: Failure to constant-fold release #51891

Open
milseman mannequin opened this issue Dec 6, 2018 · 5 comments
Open

[SR-9427] CharacterLiteralsSmall: Failure to constant-fold release #51891

milseman mannequin opened this issue Dec 6, 2018 · 5 comments
Assignees
Labels
compiler The Swift compiler in itself

Comments

@milseman
Copy link
Mannequin

milseman mannequin commented Dec 6, 2018

Previous ID SR-9427
Radar rdar://problem/52193402
Original Reporter @milseman
Type Sub-task
Additional Detail from JIRA
Votes 0
Component/s Compiler
Labels Sub-task
Assignee @eeckstein
Priority Medium

md5: 0fbda4404f5fcf530688331499575982

Parent-Task:

Issue Description:

We don't constant fold the bridgeObjectRelease of tagged pointers:

@inline(never)
func makeCharacter_UTF8Length1() -> Character {
  return "a"
}

@inline(never)
func makeCharacter_UTF8Length2() -> Character {
  return "\u{00a9}"
}

@inline(never)
func makeCharacter_UTF8Length3() -> Character {
  return "a\u{0300}"
}

@inline(never)
func makeCharacter_UTF8Length4() -> Character {
  return "\u{00a9}\u{0300}"
}

@inline(never)
func makeCharacter_UTF8Length5() -> Character {
  return "a\u{0300}\u{0301}"
}

@inline(never)
func makeCharacter_UTF8Length6() -> Character {
  return "\u{00a9}\u{0300}\u{0301}"
}

@inline(never)
func makeCharacter_UTF8Length7() -> Character {
  return "a\u{0300}\u{0301}\u{0302}"
}

@inline(never)
func makeCharacter_UTF8Length8() -> Character {
  return "\u{00a9}\u{0300}\u{0301}\u{0302}"
}

@inline(never)
func makeLiterals() {
  blackHole(makeCharacter_UTF8Length1())
  blackHole(makeCharacter_UTF8Length2())
  blackHole(makeCharacter_UTF8Length3())
  blackHole(makeCharacter_UTF8Length4())
  blackHole(makeCharacter_UTF8Length5())
  blackHole(makeCharacter_UTF8Length6())
  blackHole(makeCharacter_UTF8Length7())
  blackHole(makeCharacter_UTF8Length8())
}

_$s23mega_string_regressions12makeLiteralsyyF:
  push       rbp
  mov        rbp, rsp
  call       _$s23mega_string_regressions9blackHoleyyxlFSJ_Tg5Tf4d_n
  movabs     rdi, 0xa800000000000000
  call       imp___stubs__swift_bridgeObjectRelease
  movabs     rdi, 0xa700000000000000
  call       imp___stubs__swift_bridgeObjectRelease
  movabs     rdi, 0xa600000000000000
  call       imp___stubs__swift_bridgeObjectRelease
  movabs     rdi, 0xa500000000000000
  call       imp___stubs__swift_bridgeObjectRelease
  movabs     rdi, 0xa400000000000000
  call       imp___stubs__swift_bridgeObjectRelease
  movabs     rdi, 0xa300000000000000
  call       imp___stubs__swift_bridgeObjectRelease
  movabs     rdi, 0xa200000000000000
  call       imp___stubs__swift_bridgeObjectRelease
  movabs     rdi, 0xe100000000000000
  pop        rbp
  jmp        imp___stubs__swift_bridgeObjectRelease
@milseman
Copy link
Mannequin Author

milseman mannequin commented Dec 6, 2018

LLVM is the one to inline this:

// makeLiterals()
sil [noinline] @$s10checkstate12makeLiteralsyyF : $@convention(thin) () -> () {
bb0:
  // function_ref makeCharacter_UTF8Length1()
  %0 = function_ref @$s10checkstate25makeCharacter_UTF8Length1SJyF : $@convention(thin) () -> @owned Character // user: %1
  %1 = apply %0() : $@convention(thin) () -> @owned Character // user: %4
  // function_ref specialized blackHole<A>(_:)
  %2 = function_ref @$s10checkstate9blackHoleyyxlFSJ_Tg5Tf4d_n : $@convention(thin) () -> () // user: %3
  %3 = apply %2() : $@convention(thin) () -> ()
  release_value %1 : $Character                   // id: %4
  // function_ref makeCharacter_UTF8Length2()
  %5 = function_ref @$s10checkstate25makeCharacter_UTF8Length2SJyF : $@convention(thin) () -> @owned Character // user: %6
  %6 = apply %5() : $@convention(thin) () -> @owned Character // user: %7
  release_value %6 : $Character                   // id: %7
  // function_ref makeCharacter_UTF8Length3()
  %8 = function_ref @$s10checkstate25makeCharacter_UTF8Length3SJyF : $@convention(thin) () -> @owned Character // user: %9
  %9 = apply %8() : $@convention(thin) () -> @owned Character // user: %10
  release_value %9 : $Character                   // id: %10
  // function_ref makeCharacter_UTF8Length4()
  %11 = function_ref @$s10checkstate25makeCharacter_UTF8Length4SJyF : $@convention(thin) () -> @owned Character // user: %12
  %12 = apply %11() : $@convention(thin) () -> @owned Character // user: %13
  release_value %12 : $Character                  // id: %13
  // function_ref makeCharacter_UTF8Length5()
  %14 = function_ref @$s10checkstate25makeCharacter_UTF8Length5SJyF : $@convention(thin) () -> @owned Character // user: %15
  %15 = apply %14() : $@convention(thin) () -> @owned Character // user: %16
  release_value %15 : $Character                  // id: %16
  // function_ref makeCharacter_UTF8Length6()
  %17 = function_ref @$s10checkstate25makeCharacter_UTF8Length6SJyF : $@convention(thin) () -> @owned Character // user: %18
  %18 = apply %17() : $@convention(thin) () -> @owned Character // user: %19
  release_value %18 : $Character                  // id: %19
  // function_ref makeCharacter_UTF8Length7()
  %20 = function_ref @$s10checkstate25makeCharacter_UTF8Length7SJyF : $@convention(thin) () -> @owned Character // user: %21
  %21 = apply %20() : $@convention(thin) () -> @owned Character // user: %22
  release_value %21 : $Character                  // id: %22
  // function_ref makeCharacter_UTF8Length8()
  %23 = function_ref @$s10checkstate25makeCharacter_UTF8Length8SJyF : $@convention(thin) () -> @owned Character // user: %24
  %24 = apply %23() : $@convention(thin) () -> @owned Character // user: %25
  release_value %24 : $Character                  // id: %25
  %26 = tuple ()                                  // user: %27
  return %26 : $()                                // id: %27
} // end sil function '$s10checkstate12makeLiteralsyyF'

; Function Attrs: noinline
define swiftcc void @"$s10checkstate12makeLiteralsyyF"() #&#8203;7 {
entry:
  tail call swiftcc void @"$s10checkstate9blackHoleyyxlFSJ_Tg5Tf4d_n"()
  tail call void @swift_bridgeObjectRelease(%swift.bridge* inttoptr (i64 -6341068275337658368 to %swift.bridge*)) #&#8203;3
  tail call void @swift_bridgeObjectRelease(%swift.bridge* inttoptr (i64 -6413125869375586304 to %swift.bridge*)) #&#8203;3
  tail call void @swift_bridgeObjectRelease(%swift.bridge* inttoptr (i64 -6485183463413514240 to %swift.bridge*)) #&#8203;3
  tail call void @swift_bridgeObjectRelease(%swift.bridge* inttoptr (i64 -6557241057451442176 to %swift.bridge*)) #&#8203;3
  tail call void @swift_bridgeObjectRelease(%swift.bridge* inttoptr (i64 -6629298651489370112 to %swift.bridge*)) #&#8203;3
  tail call void @swift_bridgeObjectRelease(%swift.bridge* inttoptr (i64 -6701356245527298048 to %swift.bridge*)) #&#8203;3
  tail call void @swift_bridgeObjectRelease(%swift.bridge* inttoptr (i64 -6773413839565225984 to %swift.bridge*)) #&#8203;3
  tail call void @swift_bridgeObjectRelease(%swift.bridge* inttoptr (i64 -2233785415175766016 to %swift.bridge*)) #&#8203;3
  ret void
}

@milseman
Copy link
Mannequin Author

milseman mannequin commented Dec 6, 2018

Erik, what do you think would be a sensible solution here?

@eeckstein
Copy link
Member

This should be easy to fix. I'll take a look

@eeckstein
Copy link
Member

Just talked to Michael offline. This is a result of not inlining a function which returns a character literal. LLVM still propagates the returned constant and that's why we end up with this code.
We can optimize this in the LLVM ARC optimizer. But it's not high priority. We can live with the regression for now.

@milseman
Copy link
Mannequin Author

milseman mannequin commented Dec 7, 2018

@swift-ci create

@swift-ci swift-ci transferred this issue from apple/swift-issues Apr 25, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
compiler The Swift compiler in itself
Projects
None yet
Development

No branches or pull requests

1 participant