Skip to content

Commit 12d9311

Browse files
committed
SILCombine: run builtin simplification as part of SILCombine
That means: make `BuiltinInst` conform to `SILCombineSimplifiable`, but still also run the legacy builtin simplification in SILCombine
1 parent 8666297 commit 12d9311

File tree

8 files changed

+46
-26
lines changed

8 files changed

+46
-26
lines changed

SwiftCompilerSources/Sources/Optimizer/InstructionSimplification/SimplifyBuiltin.swift

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
import SIL
1414

15-
extension BuiltinInst : OnoneSimplifiable {
15+
extension BuiltinInst : OnoneSimplifiable, SILCombineSimplifiable {
1616
func simplify(_ context: SimplifyContext) {
1717
switch id {
1818
case .IsConcrete:
@@ -165,6 +165,11 @@ private extension BuiltinInst {
165165
case .Sizeof:
166166
value = ty.getStaticSize(context: context)
167167
case .Strideof:
168+
if isUsedAsStrideOfIndexRawPointer(context) {
169+
// Constant folding `stride` would prevent index_raw_pointer simplification.
170+
// See `simplifyIndexRawPointer` in SimplifyPointerToAddress.swift.
171+
return
172+
}
168173
value = ty.getStaticStride(context: context)
169174
case .Alignof:
170175
value = ty.getStaticAlignment(context: context)
@@ -181,7 +186,33 @@ private extension BuiltinInst {
181186
uses.replaceAll(with: literal, context)
182187
context.erase(instruction: self)
183188
}
184-
189+
190+
private func isUsedAsStrideOfIndexRawPointer(_ context: SimplifyContext) -> Bool {
191+
var worklist = ValueWorklist(context)
192+
defer { worklist.deinitialize() }
193+
worklist.pushIfNotVisited(self)
194+
while let v = worklist.pop() {
195+
for use in v.uses {
196+
switch use.instruction {
197+
case let builtin as BuiltinInst:
198+
switch builtin.id {
199+
case .SMulOver, .TruncOrBitCast, .SExtOrBitCast, .ZExtOrBitCast:
200+
worklist.pushIfNotVisited(builtin)
201+
default:
202+
break
203+
}
204+
case let tupleExtract as TupleExtractInst where tupleExtract.fieldIndex == 0:
205+
worklist.pushIfNotVisited(tupleExtract)
206+
case is IndexRawPointerInst:
207+
return true
208+
default:
209+
break
210+
}
211+
}
212+
}
213+
return false
214+
}
215+
185216
func optimizeArgumentToThinMetatype(argument: Int, _ context: SimplifyContext) {
186217
let type: Type
187218

SwiftCompilerSources/Sources/Optimizer/PassManager/PassRegistration.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ private func registerSwiftPasses() {
111111
// Instruction passes
112112
registerForSILCombine(BeginBorrowInst.self, { run(BeginBorrowInst.self, $0) })
113113
registerForSILCombine(BeginCOWMutationInst.self, { run(BeginCOWMutationInst.self, $0) })
114+
registerForSILCombine(BuiltinInst.self, { run(BuiltinInst.self, $0) })
114115
registerForSILCombine(FixLifetimeInst.self, { run(FixLifetimeInst.self, $0) })
115116
registerForSILCombine(GlobalValueInst.self, { run(GlobalValueInst.self, $0) })
116117
registerForSILCombine(StrongRetainInst.self, { run(StrongRetainInst.self, $0) })

lib/SILOptimizer/SILCombiner/SILCombiner.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,6 @@ class SILCombiner :
251251
SILInstruction *visitPartialApplyInst(PartialApplyInst *AI);
252252
SILInstruction *visitBeginApplyInst(BeginApplyInst *BAI);
253253
SILInstruction *optimizeStringObject(BuiltinInst *BI);
254-
SILInstruction *visitBuiltinInst(BuiltinInst *BI);
255254
SILInstruction *visitCondFailInst(CondFailInst *CFI);
256255
SILInstruction *visitRefToRawPointerInst(RefToRawPointerInst *RRPI);
257256
SILInstruction *visitUpcastInst(UpcastInst *UCI);

lib/SILOptimizer/SILCombiner/SILCombinerBuiltinVisitors.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -659,7 +659,7 @@ SILInstruction *SILCombiner::optimizeStringObject(BuiltinInst *BI) {
659659
setBits & andBits);
660660
}
661661

662-
SILInstruction *SILCombiner::visitBuiltinInst(BuiltinInst *I) {
662+
SILInstruction *SILCombiner::legacyVisitBuiltinInst(BuiltinInst *I) {
663663
if (I->getBuiltinInfo().ID == BuiltinValueKind::CanBeObjCClass)
664664
return optimizeBuiltinCanBeObjCClass(I, Builder);
665665
if (I->getBuiltinInfo().ID == BuiltinValueKind::IsConcrete)

lib/SILOptimizer/SILCombiner/Simplifications.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ INSTRUCTION_SIMPLIFICATION(UncheckedEnumDataInst)
5454
INSTRUCTION_SIMPLIFICATION(WitnessMethodInst)
5555
INSTRUCTION_SIMPLIFICATION(EndCOWMutationAddrInst)
5656
INSTRUCTION_SIMPLIFICATION_WITH_LEGACY(AllocStackInst)
57+
INSTRUCTION_SIMPLIFICATION_WITH_LEGACY(BuiltinInst)
5758
INSTRUCTION_SIMPLIFICATION_WITH_LEGACY(UnconditionalCheckedCastInst)
5859
INSTRUCTION_SIMPLIFICATION_WITH_LEGACY(ApplyInst)
5960
INSTRUCTION_SIMPLIFICATION_WITH_LEGACY(TryApplyInst)

test/SILOptimizer/sil_combine.sil

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2453,7 +2453,6 @@ bb0(%0 : $Builtin.Int1):
24532453
}
24542454

24552455
// CHECK-LABEL: sil @builtin_array_opt_index_raw_pointer_to_index_addr
2456-
// CHECK: [[MT:%.*]] = metatype $@thick Int32.Type
24572456
// CHECK: [[ONE:%.*]] = integer_literal $Builtin.Word, 1
24582457
// CHECK: [[PTA1:%.*]] = pointer_to_address %1 : $Builtin.RawPointer to [strict] $*Int32
24592458
// CHECK: [[CAST1:%.*]] = builtin "truncOrBitCast_Int64_Word"(%0 : $Builtin.Int64)
@@ -2463,7 +2462,8 @@ bb0(%0 : $Builtin.Int1):
24632462
// CHECK: [[CAST2:%.*]] = builtin "truncOrBitCast_Int64_Word"(%0 : $Builtin.Int64)
24642463
// CHECK: [[IAD2:%.*]] = index_addr [[PTA2]] : $*Int32, [[CAST2]] : $Builtin.Word
24652464
// CHECK: [[ATP2:%.*]] = address_to_pointer [[IAD2]] : $*Int32 to $Builtin.RawPointer
2466-
// CHECK: builtin "takeArrayFrontToBack"<Int32>([[MT]] : $@thick Int32.Type, [[ATP1]] : $Builtin.RawPointer, [[ATP2]] : $Builtin.RawPointer, [[ONE]] : $Builtin.Word) : $()
2465+
// CHECK: [[MT:%.*]] = metatype $@thin Int32.Type
2466+
// CHECK: builtin "takeArrayFrontToBack"<Int32>([[MT]] : $@thin Int32.Type, [[ATP1]] : $Builtin.RawPointer, [[ATP2]] : $Builtin.RawPointer, [[ONE]] : $Builtin.Word) : $()
24672467
// CHECK: return
24682468

24692469
sil @builtin_array_opt_index_raw_pointer_to_index_addr : $@convention(thin) (Builtin.Int64, Builtin.RawPointer, Builtin.RawPointer) -> () {

test/SILOptimizer/sil_combine_ossa.sil

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2959,7 +2959,6 @@ bb0(%0 : $Builtin.Int1):
29592959
}
29602960

29612961
// CHECK-LABEL: sil [ossa] @builtin_array_opt_index_raw_pointer_to_index_addr :
2962-
// CHECK: [[MT:%.*]] = metatype $@thick Int32.Type
29632962
// CHECK: [[ONE:%.*]] = integer_literal $Builtin.Word, 1
29642963
// CHECK: [[PTA1:%.*]] = pointer_to_address %1 : $Builtin.RawPointer to [strict] $*Int32
29652964
// CHECK: [[CAST1:%.*]] = builtin "truncOrBitCast_Int64_Word"(%0 : $Builtin.Int64)
@@ -2969,7 +2968,8 @@ bb0(%0 : $Builtin.Int1):
29692968
// CHECK: [[CAST2:%.*]] = builtin "truncOrBitCast_Int64_Word"(%0 : $Builtin.Int64)
29702969
// CHECK: [[IAD2:%.*]] = index_addr [[PTA2]] : $*Int32, [[CAST2]] : $Builtin.Word
29712970
// CHECK: [[ATP2:%.*]] = address_to_pointer [[IAD2]] : $*Int32 to $Builtin.RawPointer
2972-
// CHECK: builtin "takeArrayFrontToBack"<Int32>([[MT]] : $@thick Int32.Type, [[ATP1]] : $Builtin.RawPointer, [[ATP2]] : $Builtin.RawPointer, [[ONE]] : $Builtin.Word) : $()
2971+
// CHECK: [[MT:%.*]] = metatype $@thin Int32.Type
2972+
// CHECK: builtin "takeArrayFrontToBack"<Int32>([[MT]] : $@thin Int32.Type, [[ATP1]] : $Builtin.RawPointer, [[ATP2]] : $Builtin.RawPointer, [[ONE]] : $Builtin.Word) : $()
29732973
// CHECK: return
29742974
// CHECK: } // end sil function 'builtin_array_opt_index_raw_pointer_to_index_addr'
29752975

test/SILOptimizer/sil_combiner_concrete_prop_all_args.sil

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -552,15 +552,9 @@ bb0(%0 : $*τ_0_0):
552552

553553
// CHECK-LABEL: sil shared [noinline] @$s21existential_transform16wrap_foo_bar_cpc1as5Int32VAA21SomeClassProtocolComp_AA0h5OtherijK0p_tFTf4e_n4main0hiK0C_Tg5 : $@convention(thin) (@guaranteed SomeClassComp) -> Int32 {
554554
// CHECK: bb0(%0 : $SomeClassComp):
555-
// CHECK: %1 = integer_literal $Builtin.Int32, 10
556-
// CHECK: %2 = integer_literal $Builtin.Int32, 20
557-
// CHECK: %3 = integer_literal $Builtin.Int1, -1
558-
// CHECK: %4 = builtin "sadd_with_overflow_Int32"(%1 : $Builtin.Int32, %2 : $Builtin.Int32, %3 : $Builtin.Int1) : $(Builtin.Int32, Builtin.Int1)
559-
// CHECK: %5 = tuple_extract %4 : $(Builtin.Int32, Builtin.Int1), 0
560-
// CHECK: %6 = tuple_extract %4 : $(Builtin.Int32, Builtin.Int1), 1
561-
// CHECK: cond_fail %6 : $Builtin.Int1
562-
// CHECK: %8 = struct $Int32 (%5 : $Builtin.Int32)
563-
// CHECK: return %8 : $Int32
555+
// CHECK: %1 = integer_literal $Builtin.Int32, 30
556+
// CHECK: %2 = struct $Int32 (%1 : $Builtin.Int32)
557+
// CHECK: return %2 : $Int32
564558
// CHECK: } // end sil function '$s21existential_transform16wrap_foo_bar_cpc1as5Int32VAA21SomeClassProtocolComp_AA0h5OtherijK0p_tFTf4e_n4main0hiK0C_Tg5'
565559
sil shared [noinline] @$s21existential_transform16wrap_foo_bar_cpc1as5Int32VAA21SomeClassProtocolComp_AA0h5OtherijK0p_tFTf4e_n : $@convention(thin) <τ_0_0 where τ_0_0 : SomeClassProtocolComp, τ_0_0 : SomeOtherClassProtocolComp> (@guaranteed τ_0_0) -> Int32 {
566560
bb0(%0 : $τ_0_0):
@@ -581,15 +575,9 @@ bb0(%0 : $τ_0_0):
581575

582576
// CHECK-LABEL: sil shared [noinline] @$s21existential_transform25wrap_no_foo_bar_comp_ncpc1as5Int32VAA23SomeNoClassProtocolComp_AA0j5OtherklmN0p_tFTf4e_n4main0jklN0C_Tg5 : $@convention(thin) (@guaranteed SomeNoClassComp) -> Int32 {
583577
// CHECK: bb0(%0 : $SomeNoClassComp):
584-
// CHECK: %1 = integer_literal $Builtin.Int32, 10
585-
// CHECK: %2 = integer_literal $Builtin.Int32, 20
586-
// CHECK: %3 = integer_literal $Builtin.Int1, -1
587-
// CHECK: %4 = builtin "sadd_with_overflow_Int32"(%1 : $Builtin.Int32, %2 : $Builtin.Int32, %3 : $Builtin.Int1) : $(Builtin.Int32, Builtin.Int1)
588-
// CHECK: %5 = tuple_extract %4 : $(Builtin.Int32, Builtin.Int1), 0
589-
// CHECK: %6 = tuple_extract %4 : $(Builtin.Int32, Builtin.Int1), 1
590-
// CHECK: cond_fail %6 : $Builtin.Int1
591-
// CHECK: %8 = struct $Int32 (%5 : $Builtin.Int32)
592-
// CHECK: return %8 : $Int32
578+
// CHECK: %1 = integer_literal $Builtin.Int32, 30
579+
// CHECK: %2 = struct $Int32 (%1 : $Builtin.Int32)
580+
// CHECK: return %2 : $Int32
593581
// CHECK-LABEL: } // end sil function '$s21existential_transform25wrap_no_foo_bar_comp_ncpc1as5Int32VAA23SomeNoClassProtocolComp_AA0j5OtherklmN0p_tFTf4e_n4main0jklN0C_Tg5'
594582
sil shared [noinline] @$s21existential_transform25wrap_no_foo_bar_comp_ncpc1as5Int32VAA23SomeNoClassProtocolComp_AA0j5OtherklmN0p_tFTf4e_n : $@convention(thin) <τ_0_0 where τ_0_0 : SomeNoClassProtocolComp, τ_0_0 : SomeOtherNoClassProtocolComp> (@in_guaranteed τ_0_0) -> Int32 {
595583
bb0(%0 : $*τ_0_0):

0 commit comments

Comments
 (0)