SwiftίϯύΠϥʹContribute͢Δ·Ͱfreddi (LINE Fukuoka)Engineer Casual Meetup - Oct. 9 2020
View Slide
Agenda• Contributeͨ͠༰ ͷͳ͠• Swift ͷίϯύΠϧϑϩʔ ͷͳ͠• Swift Intermediate Language ͷͳ͠• SILOptimizer ʹ͍ͭͯ• (͋ΒͨΊͯ) Contributeͨ͠༰ ͷͳ͠
Agenda• Contributeͨ͠༰ ͷͳ͠• Swift ͷίϯύΠϧϑϩʔ ͷͳ͠• Swift Intermediate Language ͷͳ͠• SILOptimizer ʹ͍ͭͯ• (͋ΒͨΊͯ) Contributeͨ͠༰ ͷͳ͠ͷೖϑϩʔ
Contributeͨ͠༰ ͷͳ͠• ̎ͭ Contribute ͨ͠• https://github.com/apple/swift/pull/33851• ࠷దԽϩδοΫͷϛε• https://github.com/apple/swift/pull/31847• Docs ͷ BNF Ͱॻ͔Εͨ Grammer ͷϛε
Contributeͨ͠༰ ͷͳ͠• https://github.com/apple/swift/pull/33851• ࠷దԽϩδοΫͷϛε• ʮ෭࡞༻͕͋Δ͔Εͳ͍ʯϩδοΫͷݕग़ϛε• Ұ෦ڧ੍Ϋϥογϡ͕ʮ෭࡞༻ͳ͠ʯʹͳΔϛε• ࠷దԽϩδοΫ͕ҙਤͨ͠ͷͰͳ͘ͳΔՄೳੑ
Contributeͨ͠༰ ͷͳ͠
Contributeͨ͠༰ ͷͳ͠• https://github.com/apple/swift/pull/31847• υΩϡϝϯτͰղઆ͍ͯ͠Δ Grammer ͷϛε• ͕ࣗಡΜͩ SIL ͷίʔυ ͱҧ͏͔Βؾ͍ͮͨ• SIL ͷυΩϡϝϯτͨ·ʹΨόΨό
Contributeͨ͠༰ ͷͳ͠• https://github.com/apple/swift/pull/33851• ࠷దԽϩδοΫͷϛε ← ࠓͬͪ͜ͷ• ͜ͷ มߋͷཧղΛ௨ͯ͡SwiftίϯύΠϥʹೖ͢Δ
Swift ͷίϯύΠϧϑϩʔ ͷͳ͠• Swift ͜ΜͳϑϩʔͰίϯύΠϧ͞ΕΔ• Swift ίϯύΠϥΔͱͷإΑΓݟΔ͜ͱʹͳΔ
Swift ͷίϯύΠϧϑϩʔ ͷͳ͠• օ͞Μ͓ͳ͡Έ Swift ίʔυ
Swift ͷίϯύΠϧϑϩʔ ͷͳ͠• AST (நߏจ)• ϓϩάϥϜΛจ๏ͷߏʹ฿ͬͨߏʹͨ͠ͷ
Swift ͷίϯύΠϧϑϩʔ ͷͳ͠• AST (நߏจ)• ԋࢉࢠͷ༏ઌͱ͔ߏจͷߏͰܾ·ͬͨΓ
Swift ͷίϯύΠϧϑϩʔ ͷͳ͠• SIL (Swift Intermediate Language)• Swift ಛ༗ͷநදݱ
Swift ͷίϯύΠϧϑϩʔ ͷͳ͠• SIL (Swift Intermediate Language)• ͜͜ͰSwiftಛ༗ͷ ࠷దԽ͕ߦΘΕΔ• ࠓͷTopic
Swift ͷίϯύΠϧϑϩʔ ͷͳ͠• LLVM IR => …• SIL Λ LLVM IR ʹͯ͠LLVM ʹ͛Δ• ͦͷ͋ͱϦϯΧʹ͛ΒΕͨΓ• όΠφϦʹͳΔ
Swift Intermediate Language ͷͳ͠• Swift ಛ༗ͷதؒදݱ• ͜͜Ͱ Swiftಛ༗ͷ࠷దԽ͕ߦΘΕΔ
Swift Intermediate Language ͷͳ͠• ͲͪΒखݩʹ swiftc ίϚϯυ͕͋ΕੜՄೳ
Swift Intermediate Language ͷͳ͠• ࢼ͠ʹ hello world! Λ SIL Ͱ ੜͯ͠ΈΔ• ࠓճ͕࣌ؒͳ͍ͷͰ raw SIL ͚ͩ
Swift Intermediate Language ͷͳ͠• ͍ɾಡΈͮΒ͍ʢʁʣ
Swift Intermediate Language ͷͳ͠• SIL͕swiftίʔυΑΓ͘ͳΔཧ༝• ؔʢԾʣςʔϒϧͷใ• ࡉ͔͍ϝϞϦͷ֬อϦϑΝϨϯεΧϯτͷ໋ྩ• Main ؔͳͲͷల։
Swift Intermediate Language ͷͳ͠• SIL ͷߏΛେ͖͍ॱʹ• SILModule (ιʔείʔυશମ)• SILFunction (֤ؔ)• SILBasicBlock (͍ΘΏΔείʔϓ)• SILInstruction (SILίʔυҰจҰจ)
Swift Intermediate Language ͷͳ͠• ͍͍ͩͨ͜ΕΒΛཧղ͢ΔͱSILͬ͘͟ΓಡΊΔ• SIL͕swiftίʔυΑΓ͘ͳΔཧ༝• SIL ͷߏͷॱং
Swift Intermediate Language ͷͳ͠• SILModule
SILFunction
SILBasicBlock
SILBasicBlockΑ͘ΈͨΒ bb0: ͬͯͳ͍ͬͯΔ-> basic block ͷུͰ݅͢ذͰBasic Block૿͑Δ
SILInstruction
Swift Intermediate Language ͷͳ͠• ͜ͷߏΛ͍ͬͯΔͱίϯύΠϥͷίʔυͷҰ෦͕ ಡΊΔΑ͏ʹͳΔ• ͦΕ͕ SILOptimizer ͷίʔυ
SILOptimizer ʹ͍ͭͯ• SIL (Swift Intermediate Language)• ͜͜ͰSwiftಛ༗ͷ ࠷దԽ͕ߦΘΕΔ
SILOptimizer ʹ͍ͭͯ
SILOptimizer ʹ͍ͭͯ• raw SIL ੜޙɺSILOptimizer ʹΑͬͯ࠷దԽ͞ΕΔ• SILOptimizerதͷͨ͘͞Μ͋ΔPassͱ͍͏ϞδϡʔϧͰͦΕͧΕͷతͷ࠷దԽ͕ߦΘΕΔ• ࠓͦͷPassͷίʔυΛಡΉ• Passͷίʔυͷجૅ͕٧·͍ͬͯΔ
SILOptimizer ʹ͍ͭͯ• ࠓ AssumeSingleThreaded ΛಡΉ• γϯάϧεϨου͚ͩͰಈ͔͞ΕΔͷʹಛԽ͢ΔΑ͏ʹ͢Δ࠷దԽ• ΦϓγϣϯͰൃಈ͞ΕΔ• PassͷதͰଟҰ൪͍
SILOptimizer ʹ͍ͭͯSILFunctionTransform Λܧঝ-> FuncitonΛࠪ͢ΔPassʹͳΔ
SILOptimizer ʹ͍ͭͯԾؔ run Λ࣮-> Pass ͷ࠷దԽϩδοΫ͜͜ʹॻ͘
SILOptimizer ʹ͍ͭͯίϯύΠϥͷυϥΠόʢίϚϯυʣʹ͞ΕͨΦϓγϣϯΛΈΔ
SILOptimizer ʹ͍ͭͯࠓݟ͍ͯΔؔΛSILFunctionܕͷσʔλͱͯ͠ड͚औΔ
SILOptimizer ʹ͍ͭͯSILFunctionSILBasicBlockͷCollectionͱͯ͠ѻ͑ΔʢͳͷͰBBʣ
SILOptimizer ʹ͍ͭͯSILBasicBlockSILInstructionͷCollectionͱͯ͠ѻ͑ΔʢͳͷͰIʣ
SILOptimizer ʹ͍ͭͯͳͷͰɺ͜͜ͰؔͷInstructionΛ͍ࠪͯ͠Δ
SILOptimizer ʹ͍֤ͭͯInstructionܕͰදݱ͞Ε͍ͯΔΩϟετͰಛఆͷInstruction͔ௐΔ
SILOptimizer ʹ͍ͭͯϦϑΝϨϯεΧϯλؔͷInscrutionͳΒNonAtomicʹ͢Δ
SILOptimizer ʹ͍ͭͯ• AssumeSingleThreaded ʹ͍ͭͯ• FunctionͷInstructionΛࠪ• ϦϑΝϨϯεΧϯλؔͩͬͨΒnon Atomicʹ͢Δ
SILOptimizer ʹ͍ͭͯ• SILOptimizer ͷίʔυΛಡΉͱ͖ͷTips• ུޠ͕ଟ͍ͷͰίϯςΫετͰஅ͢Δ• ෳࡶͳϩδοΫ C++ Λཧղ͔ͯ͠ΒಡΉ
Contributeͨ͠༰ ͷͳ͠• ࠓճͨ͠ͷɺmayHaveSideEffect ͱ͍͏ؔ• ʮ෭࡞༻͕͋Δ͔Εͳ͍ʯInstructionΛݟΔ• SILInstruction ܕͷ ϝϯόม• Dead Code EliminationʹΘΕΔ
Contributeͨ͠༰ ͷͳ͠• ͜ͷ݅ͷ̍൪͕ϛε͍ͬͯͨ(mayTrap ؔ)
Contributeͨ͠༰ ͷͳ͠• ίϯύΠϥͷInstructionͷछྨͷදݱํ๏• ઌఔਃ্͛ͨ͠ܕʹΑΔදݱʢΩϟετʹΑΔผʣ• Enum ʹΑΔදݱʢswitch ͳͲ ʹΑΔผʣ• मਖ਼Օॴͬͪ͜Ͱදݱ͞Ε͍ͯΔ
Contributeͨ͠༰ ͷͳ͠• ͪΐͬͱ̎൪Ίͷհ
Contributeͨ͠༰ ͷͳ͠• ϝϞϦΞΫηε͕ى͜Γͦ͏ͳInstructionͷݕํ๏• SILInstruction ͷଐੑΛݟΔ• LLVMͷInstruction ͷଐੑΛݟΔ• apply Instruction ͳΒݺͼग़͠ઌͷؔͷଐੑΛݟΔ• ͜͜ΒΜͷॲཧͯͯ͝͝ͷXϚΫϩ͕ೖͬͨॲཧͳͷͰׂѪɻڵຯ͕͋ͬͨΒ࣭Ͱฉ͍͍ͯͩ͘͞
Contributeͨ͠༰ ͷͳ͠• ͏গ͠Γ͍ͨํ Θ͍Θ͍swiftc #20 ͷͷࢿྉΛݟ͍ͯͩ͘͞ • https://speakerdeck.com/freddi/mayhavesideeffect
Contributeͨ͠༰ ͷͳ͠• ͜ͷमਖ਼ՕॴͳΜͰݟ͚ͭͨͷʁ• झຯͰίϯύΠϥίʔυಡΜͰ͍ͨΒۮવΈ͚ͭͨ• bug.swift.orgͰόάνέοτʹͳ͔ͬͨ
Contributeͨ͠༰ ͷͳ͠• PRग़ͨ͠ΒɺTest ॻ͍ͨΒϚʔδ͢ΔͱݴΘΕͨ• SILͷςετ LLVMͷlitΛ͍ͬͯΔΒ͍͠• LLVM Integrated Tester ͷུ • ͦΜͳ͜ΜͳͰϚʔδ͞Εͨ• ͭʹόάνέοτΛΔඞཁͳ͍Β͍͠
Contributeͨ͠༰ ͷͳ͠• SIL.rst ͱ͍͏υΩϡϝϯτ͕SILʹ͍ͭͯৄ͘͠هࡌ• https://github.com/apple/swift/blob/main/docs/SIL.rst• ͨͩ͠ɺSIL.rst ΨόΨόͳͷͰContributeνϟϯε͕ ͨ͘͞Μ͋Δ• ͜͜मਖ਼Λ͛ͨ͜ͱ͕͋Δ
·ͱΊ• SILΛಡΈ͡ΊΔͱίϯύΠϥೖΓ͍͢• SIL͕ಡΊΔͱ࠷దԽͷίʔυ͕ಡΊΔΑ͏ʹͳΔ• Contributeʹؔͯ͠ݫ͍͠ϧʔϧͳ͍ͷͰ ؾܰʹͰ͖Δ• ಛʹυΩϡϝϯτΨόΨόͳͷͰContributeͯ͠ΈΑ͏