RFR: 8261008: Optimize Xor
Eric Liu
github.com+10482586+therealeliu at openjdk.java.net
Tue Mar 2 06:41:54 UTC 2021
On Mon, 1 Mar 2021 14:24:14 GMT, Eric Liu <github.com+10482586+theRealELiu at openjdk.org> wrote:
> If we agree that this optimization is desired, then it makes sense to also write optimizations for `x - x` and `x | x`.
>
> However, how often do these patterns occur in real code? Can you provide some examples (of source code from OSS projects) where `x ^ x`, `x - x`, or `x | x` occur?
Hi Bernardo,
I tried to find this by adding some instruments.
The JDK itself exactly has this pattern.
Current thread (0x0000fffedc3f9130): JavaThread "C2 CompilerThread3" daemon [_thread_in_native, id=3972, stack(0x0000fffecfa00000,0x0000fffecfc00000)]
Current CompileTask:
C2: 2687 1278 4 jdk.tools.jlink.internal.ImageFileCreator$$Lambda$127/0x00000008000ed3b0::accept (15 bytes)
Stack: [0x0000fffecfa00000,0x0000fffecfc00000], sp=0x0000fffecfbf9d70, free space=2023k
Native frames: (J=compiled Java code, A=aot compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [libjvm.so+0x5eb314] XorINode::Value(PhaseGVN*) const+0x134
V [libjvm.so+0x128a5b0] PhaseIdealLoop::split_thru_phi(Node*, Node*, int)+0x1d0
V [libjvm.so+0x128d7a4] PhaseIdealLoop::split_if_with_blocks_pre(Node*)+0x2b4
V [libjvm.so+0x128f360] PhaseIdealLoop::split_if_with_blocks(VectorSet&, Node_Stack&)+0x160
V [libjvm.so+0x1283280] PhaseIdealLoop::build_and_optimize(LoopOptsMode)+0xf50
V [libjvm.so+0x9cfadc] PhaseIdealLoop::optimize(PhaseIterGVN&, LoopOptsMode)+0x28c
V [libjvm.so+0x9cd21c] Compile::Optimize()+0xf3c
V [libjvm.so+0x9ce580] Compile::Compile(ciEnv*, ciMethod*, int, bool, bool, bool, bool, DirectiveSet*)+0xf50
V [libjvm.so+0x80ddbc] C2Compiler::compile_method(ciEnv*, ciMethod*, int, bool, DirectiveSet*)+0x178
V [libjvm.so+0x9de684] CompileBroker::invoke_compiler_on_method(CompileTask*)+0x9d0
V [libjvm.so+0x9df22c] CompileBroker::compiler_thread_loop()+0x328
V [libjvm.so+0x18bac90] JavaThread::thread_main_inner()+0x37c
V [libjvm.so+0x18c1a78] Thread::call_run()+0xf8
V [libjvm.so+0x149ac60] thread_native_entry(Thread*)+0x120
C [libpthread.so.0+0x7088] start_thread+0xb0
I think no one would write those kind of code directly, but GVN, after all, was a general phase which may create new node during several iteration. Besides the inline method may lead to this as well.
--Eric
-------------
PR: https://git.openjdk.java.net/jdk/pull/2776
More information about the hotspot-compiler-dev
mailing list