Some documentation about debugging the swift compiler:

https://github.com/apple/swift/blob/master/docs/DebuggingTheCompiler.rst 
<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
 
<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
 
<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
 
<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
 
<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
 
<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
 
<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

Reply via email to