RFR(S): 8142314: Bug in C1 ControlFlowOptimizer::delete_unnecessary_jumps with bytecode profiling
Vladimir Kozlov
vladimir.kozlov at oracle.com
Wed Nov 11 08:05:16 UTC 2015
Thank you for explanation. I will push it and add contributor.
Vladimir
On 11/10/15 11:54 PM, Volker Simonis wrote:
>
>
> On Wed, Nov 11, 2015 at 7:13 AM, Vladimir Kozlov <vladimir.kozlov at oracle.com <mailto:vladimir.kozlov at oracle.com>> wrote:
>
> Hi Volker,
>
> I did not get next statement.
> CMP instruction should produce flags which consumed by cmove and branch instructions.
> Can you explain what is different there for Itanium?
>
>
> On all currently supported platforms, the CMP instruction is 'generic' in the sense that it doesn't take any argument on
> how to compare (e.g. 'less-than', 'equal', etc). Instead it changes a flag register which can be later on quired for all
> the different compare variants (e.g. 'jmp_equal', 'jump_less_than', etc).
>
> On Itanium, the CMP instruction directly checks a single condition and sets a predicate register (which is a 1-bit
> register) depending on the result of the compare. Therefore, the conditions of the compare instructions and the
> depending jump instructions (which actually use modified predicate register) have to be aligned on Itanium
>
>
> > On most platforms this does no harm as the cmp of the instruction
> > doesn't depend on the condition. However, on Itanium the the cmp
> > depends on the condition. Therefore the correct code should be:
>
> Changes looks fine to me.
>
>
> Thanks!
>
> Could you please also sponsor this change?
>
> Regards,
> Volker
>
> Thanks,
> Vladimir
>
>
> On 11/9/15 6:11 AM, Volker Simonis wrote:
>
> Hi,
>
> can I please have a review and a sponsor for the following change
> contributed by gunter.haug at sap.com <mailto:gunter.haug at sap.com>:
>
> http://cr.openjdk.java.net/~simonis/webrevs/2015/8142314/
> https://bugs.openjdk.java.net/browse/JDK-8142314
>
> The function ControlFlowOptimizer::delete_unnecessary_jumps reorders
> basic block to minimize the number of branches required.
> For example, it transforms
>
> B1 ...
> cmp [NE] [R1|I] [int:0|I]
> branch [NE] [B1]
> branch [AL] [B2]
> B1 ...
> B2 ...
>
> to
>
> B1 ...
> cmp [EQ] [R1|I] [int:0|I]
> branch [EQ] [B2]
> B1 ...
> B2 ...
>
> Bytecode profiling generates a pattern like this:
>
> B1 ...
> cmp [NE] [R1|I] [int:0|I]
> cmov [NE] [B1_counter] [B2_counter] [R2]
> ...
> branch [NE] [B1]
> branch [AL] [B2]
> B1 ...
> B2 ...
>
> ControlFlowOptimizer::delete_unnecessary_jumps doesn't take care of
> the cmov. So the code above will transform to
>
> B1 ...
> cmp [EQ] [R1|I] [int:0|I]
> cmov [NE] [B1_counter] [B2_counter] [R2]
> ...
> branch [EQ] [B2]
> B1 ...
> B2 ...
>
> On most platforms this does no harm as the cmp of the instruction
> doesn't depend on the condition. However, on Itanium the the cmp
> depends on the condition. Therefore the correct code should be:
>
> B1 ...
> cmp [EQ] [R1|I] [int:0|I]
> cmov [EQ] [B2_counter] [B1_counter] [R2]
> ...
> branch [EQ] [B2]
> B1 ...
> B2 ...
>
>
> Thank you and best regards,
> Volker
>
>
More information about the hotspot-compiler-dev
mailing list