Skip to content

Commit 56cfab2

Browse files
committed
libswift: add more instruction classes
And add `UnaryInstruction` which adds a property `operand` to all unary instructions. This replaces the existing single-operand properties, which simplifies the code.
1 parent fe4ba18 commit 56cfab2

File tree

4 files changed

+111
-110
lines changed

4 files changed

+111
-110
lines changed

include/swift/SIL/SILNodes.def

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -497,11 +497,11 @@ ABSTRACT_VALUE_AND_INST(SingleValueInstruction, ValueBase, SILInstruction)
497497
ABSTRACT_SINGLE_VALUE_INST(ConversionInst, SingleValueInstruction)
498498
BRIDGED_SINGLE_VALUE_INST(UpcastInst, upcast,
499499
ConversionInst, None, DoesNotRelease)
500-
SINGLE_VALUE_INST(AddressToPointerInst, address_to_pointer,
500+
BRIDGED_SINGLE_VALUE_INST(AddressToPointerInst, address_to_pointer,
501501
ConversionInst, None, DoesNotRelease)
502502
SINGLE_VALUE_INST(PointerToAddressInst, pointer_to_address,
503503
ConversionInst, None, DoesNotRelease)
504-
SINGLE_VALUE_INST(UncheckedRefCastInst, unchecked_ref_cast,
504+
BRIDGED_SINGLE_VALUE_INST(UncheckedRefCastInst, unchecked_ref_cast,
505505
ConversionInst, None, DoesNotRelease)
506506
SINGLE_VALUE_INST(UncheckedAddrCastInst, unchecked_addr_cast,
507507
ConversionInst, None, DoesNotRelease)
@@ -513,15 +513,15 @@ ABSTRACT_VALUE_AND_INST(SingleValueInstruction, ValueBase, SILInstruction)
513513
ConversionInst, None, DoesNotRelease)
514514
SINGLE_VALUE_INST(RefToRawPointerInst, ref_to_raw_pointer,
515515
ConversionInst, None, DoesNotRelease)
516-
SINGLE_VALUE_INST(RawPointerToRefInst, raw_pointer_to_ref,
516+
BRIDGED_SINGLE_VALUE_INST(RawPointerToRefInst, raw_pointer_to_ref,
517517
ConversionInst, None, DoesNotRelease)
518518
#define LOADABLE_REF_STORAGE(Name, name, ...) \
519519
SINGLE_VALUE_INST(RefTo##Name##Inst, ref_to_##name, \
520520
ConversionInst, None, DoesNotRelease) \
521521
SINGLE_VALUE_INST(Name##ToRefInst, name##_to_ref, \
522522
ConversionInst, None, DoesNotRelease)
523523
#include "swift/AST/ReferenceStorage.def"
524-
SINGLE_VALUE_INST(ConvertFunctionInst, convert_function,
524+
BRIDGED_SINGLE_VALUE_INST(ConvertFunctionInst, convert_function,
525525
ConversionInst, None, DoesNotRelease)
526526
SINGLE_VALUE_INST(ConvertEscapeToNoEscapeInst, convert_escape_to_noescape,
527527
ConversionInst, None, DoesNotRelease)
@@ -535,15 +535,15 @@ ABSTRACT_VALUE_AND_INST(SingleValueInstruction, ValueBase, SILInstruction)
535535
ConversionInst, None, DoesNotRelease)
536536
SINGLE_VALUE_INST(BridgeObjectToWordInst, bridge_object_to_word,
537537
ConversionInst, None, DoesNotRelease)
538-
SINGLE_VALUE_INST(ThinToThickFunctionInst, thin_to_thick_function,
538+
BRIDGED_SINGLE_VALUE_INST(ThinToThickFunctionInst, thin_to_thick_function,
539539
ConversionInst, None, DoesNotRelease)
540540
SINGLE_VALUE_INST(ThickToObjCMetatypeInst, thick_to_objc_metatype,
541541
ConversionInst, None, DoesNotRelease)
542542
SINGLE_VALUE_INST(ObjCToThickMetatypeInst, objc_to_thick_metatype,
543543
ConversionInst, None, DoesNotRelease)
544-
SINGLE_VALUE_INST(ObjCMetatypeToObjectInst, objc_metatype_to_object,
544+
BRIDGED_SINGLE_VALUE_INST(ObjCMetatypeToObjectInst, objc_metatype_to_object,
545545
ConversionInst, None, DoesNotRelease)
546-
SINGLE_VALUE_INST(ObjCExistentialMetatypeToObjectInst, objc_existential_metatype_to_object,
546+
BRIDGED_SINGLE_VALUE_INST(ObjCExistentialMetatypeToObjectInst, objc_existential_metatype_to_object,
547547
ConversionInst, None, DoesNotRelease)
548548
// unconditional_checked_cast_value reads the source value and produces
549549
// a new value with a potentially different representation.
@@ -566,7 +566,7 @@ ABSTRACT_VALUE_AND_INST(SingleValueInstruction, ValueBase, SILInstruction)
566566

567567
BRIDGED_SINGLE_VALUE_INST(ClassifyBridgeObjectInst, classify_bridge_object,
568568
SingleValueInstruction, None, DoesNotRelease)
569-
SINGLE_VALUE_INST(ValueToBridgeObjectInst, value_to_bridge_object,
569+
BRIDGED_SINGLE_VALUE_INST(ValueToBridgeObjectInst, value_to_bridge_object,
570570
SingleValueInstruction, None, DoesNotRelease)
571571
SINGLE_VALUE_INST(MarkDependenceInst, mark_dependence,
572572
SingleValueInstruction, None, DoesNotRelease)

libswift/Sources/Optimizer/FunctionPasses/MergeCondFails.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ let mergeCondFailsPass = FunctionPass(name: "merge-cond_fails", runMergeCondFail
1717
/// Return true if the operand of the cond_fail instruction looks like
1818
/// the overflow bit of an arithmetic instruction.
1919
private func hasOverflowConditionOperand(_ cfi: CondFailInst) -> Bool {
20-
if let tei = cfi.condition as? TupleExtractInst {
21-
return tei.tuple is BuiltinInst
20+
if let tei = cfi.operand as? TupleExtractInst {
21+
return tei.operand is BuiltinInst
2222
}
2323
return false
2424
}
@@ -73,10 +73,10 @@ private func mergeCondFails(_ condFailToMerge: inout StackList<CondFailInst>,
7373
mergedCond = builder.createBuiltinBinaryFunction(name: "or",
7474
operandType: prevCond.type,
7575
resultType: prevCond.type,
76-
arguments: [prevCond, cfi.condition])
76+
arguments: [prevCond, cfi.operand])
7777
didMerge = true
7878
} else {
79-
mergedCond = cfi.condition
79+
mergedCond = cfi.operand
8080
}
8181
}
8282
if !didMerge {

libswift/Sources/SIL/Instruction.swift

Lines changed: 91 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,16 @@ public class MultipleValueInstruction : Instruction {
160160
}
161161
}
162162

163+
/// Instructions, which have a single operand.
164+
public protocol UnaryInstruction : AnyObject {
165+
var operands: OperandArray { get }
166+
var operand: Value { get }
167+
}
168+
169+
extension UnaryInstruction {
170+
public var operand: Value { operands[0].value }
171+
}
172+
163173
//===----------------------------------------------------------------------===//
164174
// no-value instructions
165175
//===----------------------------------------------------------------------===//
@@ -183,57 +193,41 @@ final public class CopyAddrInst : Instruction {
183193
public var destination: Value { return destinationOperand.value }
184194
}
185195

186-
final public class EndAccessInst : Instruction {
196+
final public class EndAccessInst : Instruction, UnaryInstruction {
187197
public var beginAccess: BeginAccessInst {
188-
return operands[0].value as! BeginAccessInst
198+
return operand as! BeginAccessInst
189199
}
190200
}
191201

192-
final public class EndBorrowInst : Instruction {
193-
public var borrowedValue: Value { return operands[0].value }
194-
}
202+
final public class EndBorrowInst : Instruction, UnaryInstruction {}
195203

196-
final public class DeallocStackInst : Instruction {
204+
final public class DeallocStackInst : Instruction, UnaryInstruction {
197205
public var allocstack: AllocStackInst {
198-
return operands[0].value as! AllocStackInst
206+
return operand as! AllocStackInst
199207
}
200208
}
201209

202-
final public class CondFailInst : Instruction {
203-
public var condition: Value { operands[0].value }
204-
210+
final public class CondFailInst : Instruction, UnaryInstruction {
205211
public override var mayTrap: Bool { true }
206212

207213
public var message: String { CondFailInst_getMessage(bridged).string }
208214
}
209215

210-
final public class FixLifetimeInst : Instruction {
211-
public var value: Value { operands[0].value }
212-
}
216+
final public class FixLifetimeInst : Instruction, UnaryInstruction {}
213217

214-
final public class DebugValueInst : Instruction {
215-
public var value: Value { operands[0].value }
216-
}
218+
final public class DebugValueInst : Instruction, UnaryInstruction {}
217219

218-
final public class DebugValueAddrInst : Instruction {
219-
public var address: Value { operands[0].value }
220-
}
220+
final public class DebugValueAddrInst : Instruction, UnaryInstruction {}
221221

222222
final public class UnconditionalCheckedCastAddrInst : Instruction {
223223
public override var mayTrap: Bool { true }
224224
}
225225

226-
final public class SetDeallocatingInst : Instruction {
227-
public var reference: Value { operands[0].value }
228-
}
226+
final public class SetDeallocatingInst : Instruction, UnaryInstruction {}
229227

230-
final public class DeallocRefInst : Instruction {
231-
public var reference: Value { operands[0].value }
232-
}
228+
final public class DeallocRefInst : Instruction, UnaryInstruction {}
233229

234-
public class RefCountingInst : Instruction {
235-
final public var reference: Value { operands[0].value }
236-
}
230+
public class RefCountingInst : Instruction, UnaryInstruction {}
237231

238232
final public class StrongRetainInst : RefCountingInst {
239233
}
@@ -247,13 +241,9 @@ final public class StrongReleaseInst : RefCountingInst {
247241
final public class ReleaseValueInst : RefCountingInst {
248242
}
249243

250-
final public class DestroyValueInst : Instruction {
251-
public var value: Value { operands[0].value }
252-
}
244+
final public class DestroyValueInst : Instruction, UnaryInstruction {}
253245

254-
final public class DestroyAddrInst : Instruction {
255-
public var address: Value { operands[0].value }
256-
}
246+
final public class DestroyAddrInst : Instruction, UnaryInstruction {}
257247

258248
final public class UnimplementedRefCountingInst : RefCountingInst {}
259249

@@ -266,43 +256,40 @@ final public class UnimplementedRefCountingInst : RefCountingInst {}
266256
final public class UnimplementedSingleValueInst : SingleValueInstruction {
267257
}
268258

269-
final public class LoadInst : SingleValueInstruction {
270-
public var address: Value { operands[0].value }
271-
}
259+
final public class LoadInst : SingleValueInstruction, UnaryInstruction {}
272260

273-
final public class LoadBorrowInst : SingleValueInstruction {
274-
public var address: Value { operands[0].value }
275-
}
261+
final public class LoadBorrowInst : SingleValueInstruction, UnaryInstruction {}
276262

277263
final public class BuiltinInst : SingleValueInstruction {}
278264

279-
final public class UpcastInst : SingleValueInstruction {
280-
public var source: Value { operands[0].value }
281-
}
265+
final public class UpcastInst : SingleValueInstruction, UnaryInstruction {}
282266

283-
final public class InitExistentialRefInst : SingleValueInstruction {
284-
public var reference: Value { operands[0].value }
285-
}
267+
final public
268+
class UncheckedRefCastInst : SingleValueInstruction, UnaryInstruction {}
286269

287-
final public class OpenExistentialRefInst : SingleValueInstruction {
288-
public var existential: Value { operands[0].value }
289-
}
270+
final public
271+
class RawPointerToRefInst : SingleValueInstruction, UnaryInstruction {}
290272

291-
final public class InitExistentialMetatypeInst : SingleValueInstruction {
292-
public var existential: Value { operands[0].value }
293-
}
273+
final public
274+
class AddressToPointerInst : SingleValueInstruction, UnaryInstruction {}
294275

295-
final public class OpenExistentialMetatypeInst : SingleValueInstruction {
296-
public var existentialMetatype: Value { operands[0].value }
297-
}
276+
final public
277+
class InitExistentialRefInst : SingleValueInstruction, UnaryInstruction {}
298278

299-
final public class ValueMetatypeInst : SingleValueInstruction {
300-
public var value: Value { operands[0].value }
301-
}
279+
final public
280+
class OpenExistentialRefInst : SingleValueInstruction, UnaryInstruction {}
302281

303-
final public class ExistentialMetatypeInst : SingleValueInstruction {
304-
public var existential: Value { operands[0].value }
305-
}
282+
final public
283+
class InitExistentialMetatypeInst : SingleValueInstruction, UnaryInstruction {}
284+
285+
final public
286+
class OpenExistentialMetatypeInst : SingleValueInstruction, UnaryInstruction {}
287+
288+
final public
289+
class ValueMetatypeInst : SingleValueInstruction, UnaryInstruction {}
290+
291+
final public
292+
class ExistentialMetatypeInst : SingleValueInstruction, UnaryInstruction {}
306293

307294
public class GlobalAccessInst : SingleValueInstruction {
308295
final public var global: GlobalVariable {
@@ -317,71 +304,77 @@ final public class GlobalValueInst : GlobalAccessInst {}
317304
final public class TupleInst : SingleValueInstruction {
318305
}
319306

320-
final public class TupleExtractInst : SingleValueInstruction {
321-
public var tuple: Value { operands[0].value }
307+
final public class TupleExtractInst : SingleValueInstruction, UnaryInstruction {
322308
public var fieldIndex: Int { TupleExtractInst_fieldIndex(bridged) }
323309
}
324310

325-
final public class TupleElementAddrInst : SingleValueInstruction {
326-
public var tupleAddress: Value { operands[0].value }
311+
final public
312+
class TupleElementAddrInst : SingleValueInstruction, UnaryInstruction {
327313
public var fieldIndex: Int { TupleElementAddrInst_fieldIndex(bridged) }
328314
}
329315

330316
final public class StructInst : SingleValueInstruction {
331317
}
332318

333-
final public class StructExtractInst : SingleValueInstruction {
334-
public var structOp: Value { operands[0].value }
319+
final public class StructExtractInst : SingleValueInstruction, UnaryInstruction {
335320
public var fieldIndex: Int { StructExtractInst_fieldIndex(bridged) }
336321
}
337322

338-
final public class StructElementAddrInst : SingleValueInstruction {
339-
public var structAddress: Value { operands[0].value }
323+
final public
324+
class StructElementAddrInst : SingleValueInstruction, UnaryInstruction {
340325
public var fieldIndex: Int { StructElementAddrInst_fieldIndex(bridged) }
341326
}
342327

343-
final public class EnumInst : SingleValueInstruction {
344-
public var payload: Value { operands[0].value }
328+
final public class EnumInst : SingleValueInstruction, UnaryInstruction {
345329
public var caseIndex: Int { EnumInst_caseIndex(bridged) }
346330
}
347331

348-
final public class UncheckedEnumDataInst : SingleValueInstruction {
349-
public var enumOp: Value { operands[0].value }
332+
final public
333+
class UncheckedEnumDataInst : SingleValueInstruction, UnaryInstruction {
350334
public var caseIndex: Int { UncheckedEnumDataInst_caseIndex(bridged) }
351335
}
352336

353-
final public class RefElementAddrInst : SingleValueInstruction {
354-
public var reference: Value { operands[0].value }
337+
final public class RefElementAddrInst : SingleValueInstruction, UnaryInstruction {
355338
public var fieldIndex: Int { RefElementAddrInst_fieldIndex(bridged) }
356339
}
357340

358-
final public class RefTailAddrInst : SingleValueInstruction {
359-
public var reference: Value { operands[0].value }
360-
}
341+
final public class RefTailAddrInst : SingleValueInstruction, UnaryInstruction {}
361342

362-
final public class UnconditionalCheckedCastInst : SingleValueInstruction {
343+
final public
344+
class UnconditionalCheckedCastInst : SingleValueInstruction, UnaryInstruction {
363345
public override var mayTrap: Bool { true }
364346
}
365347

366-
final public class UnconditionalCheckedCastValueInst : SingleValueInstruction {
348+
final public
349+
class UnconditionalCheckedCastValueInst : SingleValueInstruction,
350+
UnaryInstruction {
367351
public override var mayTrap: Bool { true }
368352
}
369353

370-
final public class BeginAccessInst : SingleValueInstruction {
371-
public var address: Value { operands[0].value }
372-
}
354+
final public
355+
class ConvertFunctionInst : SingleValueInstruction, UnaryInstruction {}
373356

374-
final public class BeginBorrowInst : SingleValueInstruction {
375-
public var source: Value { operands[0].value }
376-
}
357+
final public
358+
class ThinToThickFunctionInst : SingleValueInstruction, UnaryInstruction {}
377359

378-
final public class CopyValueInst : SingleValueInstruction {
379-
public var source: Value { operands[0].value }
380-
}
360+
final public
361+
class ObjCExistentialMetatypeToObjectInst : SingleValueInstruction,
362+
UnaryInstruction {}
381363

382-
final public class ClassifyBridgeObjectInst : SingleValueInstruction {
383-
public var reference: Value { operands[0].value }
384-
}
364+
final public
365+
class ObjCMetatypeToObjectInst : SingleValueInstruction, UnaryInstruction {}
366+
367+
final public
368+
class ValueToBridgeObjectInst : SingleValueInstruction, UnaryInstruction {}
369+
370+
final public class BeginAccessInst : SingleValueInstruction, UnaryInstruction {}
371+
372+
final public class BeginBorrowInst : SingleValueInstruction, UnaryInstruction {}
373+
374+
final public class CopyValueInst : SingleValueInstruction, UnaryInstruction {}
375+
376+
final public
377+
class ClassifyBridgeObjectInst : SingleValueInstruction, UnaryInstruction {}
385378

386379
final public class PartialApplyInst : SingleValueInstruction, ApplySite {
387380
public var numArguments: Int { PartialApplyInst_numArguments(bridged) }
@@ -449,10 +442,10 @@ public class TermInst : Instruction {
449442
final public class UnreachableInst : TermInst {
450443
}
451444

452-
final public class ReturnInst : TermInst {
445+
final public class ReturnInst : TermInst, UnaryInstruction {
453446
}
454447

455-
final public class ThrowInst : TermInst {
448+
final public class ThrowInst : TermInst, UnaryInstruction {
456449
}
457450

458451
final public class YieldInst : TermInst {
@@ -524,15 +517,15 @@ final public class SwitchEnumAddrInst : TermInst {
524517
final public class DynamicMethodBranchInst : TermInst {
525518
}
526519

527-
final public class AwaitAsyncContinuationInst : TermInst {
520+
final public class AwaitAsyncContinuationInst : TermInst, UnaryInstruction {
528521
}
529522

530-
final public class CheckedCastBranchInst : TermInst {
523+
final public class CheckedCastBranchInst : TermInst, UnaryInstruction {
531524
}
532525

533-
final public class CheckedCastAddrBranchInst : TermInst {
526+
final public class CheckedCastAddrBranchInst : TermInst, UnaryInstruction {
534527
}
535528

536-
final public class CheckedCastValueBranchInst : TermInst {
529+
final public class CheckedCastValueBranchInst : TermInst, UnaryInstruction {
537530
}
538531

0 commit comments

Comments
 (0)