Skip to content

Commit b9d0aa3

Browse files
authored
Merge pull request #67395 from eeckstein/redundant-load-elimination
Optimizer: re-implement the RedundantLoadElimination pass in Swift
2 parents 627175f + 29246fd commit b9d0aa3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+1290
-3887
lines changed

SwiftCompilerSources/Sources/Optimizer/Analysis/AliasAnalysis.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ struct AliasAnalysis {
3636
static func register() {
3737
BridgedAliasAnalysis.registerAnalysis(
3838
// getMemEffectsFn
39-
{ (bridgedCtxt: BridgedPassContext, bridgedVal: BridgedValue, bridgedInst: BridgedInstruction) -> swift.MemoryBehavior in
39+
{ (bridgedCtxt: BridgedPassContext, bridgedVal: BridgedValue, bridgedInst: BridgedInstruction, complexityBudget: Int) -> swift.MemoryBehavior in
4040
let context = FunctionPassContext(_bridged: bridgedCtxt)
4141
let inst = bridgedInst.instruction
4242
let val = bridgedVal.value
@@ -47,7 +47,8 @@ struct AliasAnalysis {
4747
case let builtin as BuiltinInst:
4848
return getMemoryEffect(ofBuiltin: builtin, for: val, path: path, context).bridged
4949
default:
50-
if val.at(path).isEscaping(using: EscapesToInstructionVisitor(target: inst, isAddress: true), context) {
50+
if val.at(path).isEscaping(using: EscapesToInstructionVisitor(target: inst, isAddress: true),
51+
complexityBudget: complexityBudget, context) {
5152
return .MayReadWrite
5253
}
5354
return .None

SwiftCompilerSources/Sources/Optimizer/FunctionPasses/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ swift_compiler_sources(Optimizer
1717
ObjCBridgingOptimization.swift
1818
MergeCondFails.swift
1919
NamedReturnValueOptimization.swift
20+
RedundantLoadElimination.swift
2021
ReleaseDevirtualizer.swift
2122
SimplificationPasses.swift
2223
StackPromotion.swift

SwiftCompilerSources/Sources/Optimizer/FunctionPasses/DeadStoreElimination.swift

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ private func tryEliminate(store: StoreInst, _ context: FunctionPassContext) {
8888
case .dead:
8989
// The new individual stores are inserted right after the current store and
9090
// will be optimized in the following loop iterations.
91-
store.split(context)
91+
store.trySplit(context)
9292
}
9393
}
9494
}
@@ -158,27 +158,6 @@ private extension StoreInst {
158158
}
159159
}
160160

161-
func split(_ context: FunctionPassContext) {
162-
let builder = Builder(after: self, context)
163-
let type = source.type
164-
if type.isStruct {
165-
for idx in 0..<type.getNominalFields(in: parentFunction).count {
166-
let srcField = builder.createStructExtract(struct: source, fieldIndex: idx)
167-
let destFieldAddr = builder.createStructElementAddr(structAddress: destination, fieldIndex: idx)
168-
builder.createStore(source: srcField, destination: destFieldAddr, ownership: storeOwnership)
169-
}
170-
} else if type.isTuple {
171-
for idx in 0..<type.tupleElements.count {
172-
let srcField = builder.createTupleExtract(tuple: source, elementIndex: idx)
173-
let destFieldAddr = builder.createTupleElementAddr(tupleAddress: destination, elementIndex: idx)
174-
builder.createStore(source: srcField, destination: destFieldAddr, ownership: storeOwnership)
175-
}
176-
} else {
177-
fatalError("a materializable projection path should only contain struct and tuple projections")
178-
}
179-
context.erase(instruction: self)
180-
}
181-
182161
var hasValidOwnershipForDeadStoreElimination: Bool {
183162
switch storeOwnership {
184163
case .unqualified, .trivial:

0 commit comments

Comments
 (0)