Skip to content

Commit d457368

Browse files
committed
SIL Optimizer: move some projection path utilities from RedundantLoadElimination and AccessUtils into OptUtils
NFC
1 parent d91759d commit d457368

File tree

3 files changed

+70
-72
lines changed

3 files changed

+70
-72
lines changed

SwiftCompilerSources/Sources/Optimizer/FunctionPasses/RedundantLoadElimination.swift

Lines changed: 0 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -577,59 +577,3 @@ private struct Liferange {
577577
return false
578578
}
579579
}
580-
581-
private extension Value {
582-
func createProjection(path: SmallProjectionPath, builder: Builder) -> Value {
583-
let (kind, index, subPath) = path.pop()
584-
switch kind {
585-
case .root:
586-
return self
587-
case .structField:
588-
let structExtract = builder.createStructExtract(struct: self, fieldIndex: index)
589-
return structExtract.createProjection(path: subPath, builder: builder)
590-
case .tupleField:
591-
let tupleExtract = builder.createTupleExtract(tuple: self, elementIndex: index)
592-
return tupleExtract.createProjection(path: subPath, builder: builder)
593-
default:
594-
fatalError("path is not materializable")
595-
}
596-
}
597-
598-
func createAddressProjection(path: SmallProjectionPath, builder: Builder) -> Value {
599-
let (kind, index, subPath) = path.pop()
600-
switch kind {
601-
case .root:
602-
return self
603-
case .structField:
604-
let structExtract = builder.createStructElementAddr(structAddress: self, fieldIndex: index)
605-
return structExtract.createAddressProjection(path: subPath, builder: builder)
606-
case .tupleField:
607-
let tupleExtract = builder.createTupleElementAddr(tupleAddress: self, elementIndex: index)
608-
return tupleExtract.createAddressProjection(path: subPath, builder: builder)
609-
default:
610-
fatalError("path is not materializable")
611-
}
612-
}
613-
614-
func createProjectionAndCopy(path: SmallProjectionPath, builder: Builder) -> Value {
615-
if path.isEmpty {
616-
return self.copyIfNotTrivial(builder)
617-
}
618-
if self.ownership == .owned {
619-
let borrow = builder.createBeginBorrow(of: self)
620-
let projectedValue = borrow.createProjection(path: path, builder: builder)
621-
let result = projectedValue.copyIfNotTrivial(builder)
622-
builder.createEndBorrow(of: borrow)
623-
return result
624-
}
625-
let projectedValue = self.createProjection(path: path, builder: builder)
626-
return projectedValue.copyIfNotTrivial(builder)
627-
}
628-
629-
func copyIfNotTrivial(_ builder: Builder) -> Value {
630-
if type.isTrivial(in: parentFunction) {
631-
return self
632-
}
633-
return builder.createCopyValue(operand: self)
634-
}
635-
}

SwiftCompilerSources/Sources/Optimizer/Utilities/AccessUtils.swift

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -342,22 +342,6 @@ struct AccessPath : CustomStringConvertible {
342342
}
343343
}
344344

345-
private extension SmallProjectionPath {
346-
/// Returns true if the path only contains projections which can be materialized as
347-
/// SIL struct or tuple projection instructions - for values or addresses.
348-
var isMaterializable: Bool {
349-
let (kind, _, subPath) = pop()
350-
switch kind {
351-
case .root:
352-
return true
353-
case .structField, .tupleField:
354-
return subPath.isMaterializable
355-
default:
356-
return false
357-
}
358-
}
359-
}
360-
361345
private func canBeOperandOfIndexAddr(_ value: Value) -> Bool {
362346
switch value {
363347
case is IndexAddrInst, is RefTailAddrInst, is PointerToAddressInst:

SwiftCompilerSources/Sources/Optimizer/Utilities/OptUtils.swift

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,60 @@ extension Value {
5454
}
5555
return true
5656
}
57+
58+
func createProjection(path: SmallProjectionPath, builder: Builder) -> Value {
59+
let (kind, index, subPath) = path.pop()
60+
switch kind {
61+
case .root:
62+
return self
63+
case .structField:
64+
let structExtract = builder.createStructExtract(struct: self, fieldIndex: index)
65+
return structExtract.createProjection(path: subPath, builder: builder)
66+
case .tupleField:
67+
let tupleExtract = builder.createTupleExtract(tuple: self, elementIndex: index)
68+
return tupleExtract.createProjection(path: subPath, builder: builder)
69+
default:
70+
fatalError("path is not materializable")
71+
}
72+
}
73+
74+
func createAddressProjection(path: SmallProjectionPath, builder: Builder) -> Value {
75+
let (kind, index, subPath) = path.pop()
76+
switch kind {
77+
case .root:
78+
return self
79+
case .structField:
80+
let structExtract = builder.createStructElementAddr(structAddress: self, fieldIndex: index)
81+
return structExtract.createAddressProjection(path: subPath, builder: builder)
82+
case .tupleField:
83+
let tupleExtract = builder.createTupleElementAddr(tupleAddress: self, elementIndex: index)
84+
return tupleExtract.createAddressProjection(path: subPath, builder: builder)
85+
default:
86+
fatalError("path is not materializable")
87+
}
88+
}
89+
90+
func createProjectionAndCopy(path: SmallProjectionPath, builder: Builder) -> Value {
91+
if path.isEmpty {
92+
return self.copyIfNotTrivial(builder)
93+
}
94+
if self.ownership == .owned {
95+
let borrow = builder.createBeginBorrow(of: self)
96+
let projectedValue = borrow.createProjection(path: path, builder: builder)
97+
let result = projectedValue.copyIfNotTrivial(builder)
98+
builder.createEndBorrow(of: borrow)
99+
return result
100+
}
101+
let projectedValue = self.createProjection(path: path, builder: builder)
102+
return projectedValue.copyIfNotTrivial(builder)
103+
}
104+
105+
func copyIfNotTrivial(_ builder: Builder) -> Value {
106+
if type.isTrivial(in: parentFunction) {
107+
return self
108+
}
109+
return builder.createCopyValue(operand: self)
110+
}
57111
}
58112

59113
extension Builder {
@@ -265,6 +319,22 @@ extension UseList {
265319
}
266320
}
267321

322+
extension SmallProjectionPath {
323+
/// Returns true if the path only contains projections which can be materialized as
324+
/// SIL struct or tuple projection instructions - for values or addresses.
325+
var isMaterializable: Bool {
326+
let (kind, _, subPath) = pop()
327+
switch kind {
328+
case .root:
329+
return true
330+
case .structField, .tupleField:
331+
return subPath.isMaterializable
332+
default:
333+
return false
334+
}
335+
}
336+
}
337+
268338
extension FunctionPassContext {
269339
/// Returns true if any blocks were removed.
270340
func removeDeadBlocks(in function: Function) -> Bool {

0 commit comments

Comments
 (0)