Re: Crash due to bad oop map
Denghui Dong
denghui.ddh at alibaba-inc.com
Fri Jul 22 05:57:21 UTC 2022
Hi @dean-long,
I tried, and it works.
Another way is to skip the processing of MachTemp when building the oop map. Do you think this is the correct way?
Denghui Dong
------------------------------------------------------------------
From:dean.long <dean.long at oracle.com>
Send Time:2022年7月22日(星期五) 11:28
To:undefined <undefined>; undefined <undefined>
Subject:Re: Crash due to bad oop map
Hi Denghui Dong. This looks like JDK-8051805
(https://bugs.openjdk.org/browse/JDK-8051805). As you discovered, it is
triggered when RegN is used as a TEMP. As a work-around, have you tried
using rRegI instead of rRegN for your TEMPs?
dl
On 7/21/22 12:11 AM, Denghui Dong wrote:
> Hi team,
>
> We encountered a crash due to a bad oop map.
> The following steps can quickly reproduce the problem on JDK master on
> Linux x64:
> 1. Modify z_x86_64.ad and add 3 temporary registers of type rRegN to
> zLoadP(If this change is illegal, please let me know)
> ```
> diff --git a/src/hotspot/cpu/x86/gc/z/z_x86_64.ad
> b/src/hotspot/cpu/x86/gc/z/z_x86_64.ad
> index f3e19b41733..129c93d3da8 100644
> --- a/src/hotspot/cpu/x86/gc/z/z_x86_64.ad
> +++ b/src/hotspot/cpu/x86/gc/z/z_x86_64.ad
> @@ -63,11 +63,11 @@ static void z_load_barrier_cmpxchg(MacroAssembler&
> _masm, const MachNode* node,
> %}
> // Load Pointer
> -instruct zLoadP(rRegP dst, memory mem, rFlagsReg cr)
> +instruct zLoadP(rRegP dst, memory mem, rRegN tmp1, rRegN tmp2, rRegN
> tmp3, rFlagsReg cr)
> %{
> predicate(UseZGC && n->as_Load()->barrier_data() != 0);
> match(Set dst (LoadP mem));
> - effect(KILL cr, TEMP dst);
> + effect(KILL cr, TEMP dst, TEMP tmp1, TEMP tmp2, TEMP tmp3);
> ins_cost(125);
> ```
> 2. Run the following code
> (./build/linux-x86_64-server-fastdebug/images/jdk/bin/java -XX:-Inline
> -XX:CompileCommand=compileonly,Test::call -XX:+PrintAssembly
> -XX:PrintIdealGraphLevel=2 -XX:PrintIdealGraphFile=call.xml -XX:+UseZGC
> -XX:+UseNewCode -XX:+PrintGC -Xmx500m -Xms500m -XX:-Inline Test)
> ```
> import java.util.concurrent.locks.Lock;
> import java.util.concurrent.locks.ReentrantLock;
> class Test {
> private Lock lock = new ReentrantLock();
> public static void main(String... args) throws Exception {
> new Thread(() -> {
> while (true) {
> byte[] b = new byte[10 * 1024 * 1024];
> }
> }).start();
> while (true) {
> new Test().call(() -> { new Object(); });
> }
> }
> public void call(Runnable cb) {
> lock.lock();
> try {
> cb.run();
> } finally {
> lock.unlock();
> }
> }
> }
> ```
>
> It can be observed through the IGV Final Code that zLoadP(202, 204) and
> a MachTemp(81) it uses are placed in different blocks. When processing
> CallStaticJavaDirect(74) in the c2 buildOopMap step, MachTemp(81) is
> considered to be alive. Because the register type specified by the above
> modification is rRegN (if it is specified as rRegI or rRegP, no crash
> will occur), so the type of MachTemp(81) is narrowOop, which will
> eventually be added to the oopMap of CallStaticJavaDirect(74). But
> logically, zLoadP doesn't depend on the original value of MachTemp(81),
> so I don't think it should be added to oopMap.
>
> I put the ideal graph file to http://cr.openjdk.java.net/~ddong/call.xml
> <http://cr.openjdk.java.net/~ddong/call.xml>
>
> I think the problem may lie in two places:
> 1. gcm and regAlloc do not put MachTemp(81) in the correct location
> 2. buildOopMap should not treat MachTemp as Oop because its original
> value is meaningless
>
> I'm not a JIT expert and sorry if there is anything unnatural or
> non-standard in the above description.
>
> Any input is appreciated.
>
> Denghui Dong
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/hotspot-compiler-dev/attachments/20220722/98245c25/attachment-0001.htm>
More information about the hotspot-compiler-dev
mailing list