There are currently more blocks shown in the "Final Code" graph than actually present in the assembly/OptoAssembly output which is confusing.
Example:
Assembly/OptoAssembly: B2 -> B21
045 B2: # out( B21 B3 ) <- in( B1 ) Freq: 0.999999
045 cmpl R13, R9
048 jge B21 P=0.019608 C=102.000000
....
18a B21: # out( N266 ) <- in( B2 B20 B17 ) Freq: 0.999993
18a vzeroupper
IGV: B2 -> no block -> B41 -> no block -> B21
(see attached final_phase_IGV.png)
The idea of this RFE is to make the "Final Code" graph in the IGV more similar to the assembly/OptoAssembly in terms of blocks.
Maybe we could do something similar in IdealGraphPrinter::print() as in PhaseOutput::dump_asm_on() where we only print blocks that are not connectors (call to block->is_connector()) to get rid of the additional blocks. We could then filter out all uninteresting nodes as in [1].
This leaves the question if we should use this new view just as an option to switch to and keep to the old view or if we should completely replace it with the new "assembly/OptoAssembly" like view. Based on my experience/usage, I opt for the latter. I usually try to map the assembly/OptoAssembly output to the "Final Code" graph in the IGV and then start to go backwards to earlier graphs from there. The additional blocks are more confusing than helping.
[1] https://github.com/openjdk/jdk/blob/3a21e1df7004e2c19b312163ea31ffb20069870f/src/hotspot/share/opto/output.cpp#L3548-L3557
Example:
Assembly/OptoAssembly: B2 -> B21
045 B2: # out( B21 B3 ) <- in( B1 ) Freq: 0.999999
045 cmpl R13, R9
048 jge B21 P=0.019608 C=102.000000
....
18a B21: # out( N266 ) <- in( B2 B20 B17 ) Freq: 0.999993
18a vzeroupper
IGV: B2 -> no block -> B41 -> no block -> B21
(see attached final_phase_IGV.png)
The idea of this RFE is to make the "Final Code" graph in the IGV more similar to the assembly/OptoAssembly in terms of blocks.
Maybe we could do something similar in IdealGraphPrinter::print() as in PhaseOutput::dump_asm_on() where we only print blocks that are not connectors (call to block->is_connector()) to get rid of the additional blocks. We could then filter out all uninteresting nodes as in [1].
This leaves the question if we should use this new view just as an option to switch to and keep to the old view or if we should completely replace it with the new "assembly/OptoAssembly" like view. Based on my experience/usage, I opt for the latter. I usually try to map the assembly/OptoAssembly output to the "Final Code" graph in the IGV and then start to go backwards to earlier graphs from there. The additional blocks are more confusing than helping.
[1] https://github.com/openjdk/jdk/blob/3a21e1df7004e2c19b312163ea31ffb20069870f/src/hotspot/share/opto/output.cpp#L3548-L3557
- blocks
-
JDK-8297694 IdealGraphVisualizer improvements
- Open