swiftlang/swift

[SR-7842] Inconsistent codegen for closed ranges vs bit-manipulation

Open

#50,378 创建于 2018年6月1日

在 GitHub 查看
 (15 评论) (0 反应) (0 负责人)Swift (10,719 fork)batch import
SILOptimizerbugcompilergood first issueperformancestandard library

仓库指标

Star
 (69,989 star)
PR 合并指标
 (平均合并 7天 6小时) (30 天内合并 556 个 PR)

描述

Previous ID SR-7842
Radar rdar://problem/40725067
Original Reporter @milseman
Type Bug

Attachment: Download

Votes 0
Component/s Compiler
Labels Bug, Optimizer, Performance, StarterBug
Assignee None
Priority Medium

md5: 223093f3dc3457d4c7f42d8a0e46938f

Issue Description:

ClosedRange<UInt8> demonstrates poor codegen compared to explicit bit manipulation.

@usableFromInline
func _isContinuation_bits(_ x: UInt8) -> Bool {
  return x & 0b1100_0000 == 0b1000_0000
}

@usableFromInline
func _isContinuation_range(_ x: UInt8) -> Bool {
  let continuation: ClosedRange<UInt8> = 0x80...0xBF
  return continuation.contains(x)
}

for i in 0...UInt8.max {
  guard _isContinuation_bits(i) == _isContinuation_range(i) else { fatalError("mismatch") }
}
print("done")

The code generated for _isContinuation_bits is superior:

                     _$S3foo20_isContinuation_bitsySbs5UInt8VF:
000000010000701c         and        w8, w0, #&#8203;0xc0
0000000100007020         cmp        w8, #&#8203;0x80
0000000100007024         cset       w0, eq
0000000100007028         ret
                        ; endp

                     _$S3foo21_isContinuation_rangeySbs5UInt8VF:
000000010000702c         and        w8, w0, #&#8203;0xff
0000000100007030         sxtb       w9, w0
0000000100007034         cmp        w9, #&#8203;0x0
0000000100007038         cset       w9, lt
000000010000703c         cmp        w8, #&#8203;0xc0
0000000100007040         cset       w8, lo
0000000100007044         and        w0, w9, w8
0000000100007048         ret
                        ; endp

贡献者指南