Arnold, Thanks for the explanation of what’s going on here. Has the “optimizing a semantic function called from a semantic function” issue happened before, and is there a standard workaround?
I feel like adding an earlier optimization pipeline, and adding a new InlineSelection to the performance inliner, is a clunky solution to the problem. Ben Ng On Mar 3, 2017, 5:24 PM -0500, Arnold Schwaighofer <aschwaigho...@apple.com>, wrote: > Some documentation about debugging the swift compiler: > > https://github.com/apple/swift/blob/master/docs/DebuggingTheCompiler.rst > > Possibly, not all flags are documented: > > https://github.com/apple/swift/blob/master/lib/SILOptimizer/PassManager/PassManager.cpp > > > To your specific question: We run several stages of the PerformanceInliner > (https://github.com/apple/swift/blob/master/lib/SILOptimizer/Transforms/PerformanceInliner.cpp#L866) > during our PassPipeline > (https://github.com/apple/swift/blob/master/lib/SILOptimizer/PassManager/PassPipeline.cpp#L221) > . One stage — “the high-level stage” — inlines everything up to > “@_semantics” functions. The next stage also inlines those. > > - Run PerformanceInliner without-semantic-inlining > (https://github.com/apple/swift/blob/master/lib/SILOptimizer/PassManager/PassPipeline.cpp#L445) > - Run Optimizations that rely on seeing @semantics calls > - … > - Run PerformanceInline with-semantic-inlining > (https://github.com/apple/swift/blob/master/lib/SILOptimizer/PassManager/PassPipeline.cpp#L449) > - … > > If you mark a function like append with @_semantics which internally has > calls to @_semantics functions you prevent the optimizations that rely on > having those calls exposed/inlined from working since those calls are now > hidden behind an @_semantics function that did not get inlined. > > The file > https://github.com/apple/swift/blob/master/lib/SILOptimizer/PassManager/PassPipeline.cpp > contains the code that sets up the pass pipeline. You can see which > optimizations are scheduled in which order. > > If you want to see a list of passes being run dynamically "-Xllvm > -sil-print-pass-name" would be the flag to add, I think. > > > > On Mar 3, 2017, at 9:58 AM, Ben Ng via swift-dev <swift-dev@swift.org> > > wrote: > > > > I noticed that adding any semantic attribute to the two Array.append > > functions causes performance regressions in the Array benchmark. I think > > that it’s because the delayed inlining is blocking some array optimizations > > from happening. > > > > What are some tips for debugging this sort of issue? There are a whole > > bunch of passes, and it’s difficult to figure out how they all interact. > > Reading the SIL generated after all optimizations have been run is pretty > > tedious, and I’m hoping that there’s a smarter way to go about this > > . > > > > Can I get debug output that tells me what optimizations happened, and then > > diff the two outputs to find out what changed? > > > > I also see a “Pass Pipeline” utility that looks useful, but it’s not > > obvious to me how to use it. >
_______________________________________________ swift-dev mailing list swift-dev@swift.org https://lists.swift.org/mailman/listinfo/swift-dev