Mercurial > hg > graal-compiler
comparison src/share/vm/opto/graphKit.cpp @ 1593:2458a1f25356
6953058: G1: A bigapp crashes with SIGSEGV in compiled code
Summary: In C2's G1 post write barrier, the loads of the buffer and index fields from the DirtyCardQueue structure may be moved across a safepoint. Use the current value of "control" in the C2 IR to limit how far these loads can move.
Reviewed-by: never, iveresov, kvn
author | johnc |
---|---|
date | Mon, 07 Jun 2010 17:46:04 -0700 |
parents | b4776199210f |
children | b9bc732be7c0 |
comparison
equal
deleted
inserted
replaced
1592:5b77884bd4b7 | 1593:2458a1f25356 |
---|---|
3485 | 3485 |
3486 IdealKit ideal(gvn(), control(), merged_memory(), true); | 3486 IdealKit ideal(gvn(), control(), merged_memory(), true); |
3487 | 3487 |
3488 Node* tls = __ thread(); // ThreadLocalStorage | 3488 Node* tls = __ thread(); // ThreadLocalStorage |
3489 | 3489 |
3490 Node* no_ctrl = NULL; | |
3491 Node* no_base = __ top(); | 3490 Node* no_base = __ top(); |
3492 float likely = PROB_LIKELY(0.999); | 3491 float likely = PROB_LIKELY(0.999); |
3493 float unlikely = PROB_UNLIKELY(0.999); | 3492 float unlikely = PROB_UNLIKELY(0.999); |
3494 Node* zero = __ ConI(0); | 3493 Node* zero = __ ConI(0); |
3495 Node* zeroX = __ ConX(0); | 3494 Node* zeroX = __ ConX(0); |
3509 | 3508 |
3510 Node* buffer_adr = __ AddP(no_base, tls, __ ConX(buffer_offset)); | 3509 Node* buffer_adr = __ AddP(no_base, tls, __ ConX(buffer_offset)); |
3511 Node* index_adr = __ AddP(no_base, tls, __ ConX(index_offset)); | 3510 Node* index_adr = __ AddP(no_base, tls, __ ConX(index_offset)); |
3512 | 3511 |
3513 // Now some values | 3512 // Now some values |
3514 | 3513 // Use ctrl to avoid hoisting these values past a safepoint, which could |
3515 Node* index = __ load(no_ctrl, index_adr, TypeInt::INT, T_INT, Compile::AliasIdxRaw); | 3514 // potentially reset these fields in the JavaThread. |
3516 Node* buffer = __ load(no_ctrl, buffer_adr, TypeRawPtr::NOTNULL, T_ADDRESS, Compile::AliasIdxRaw); | 3515 Node* index = __ load(__ ctrl(), index_adr, TypeInt::INT, T_INT, Compile::AliasIdxRaw); |
3517 | 3516 Node* buffer = __ load(__ ctrl(), buffer_adr, TypeRawPtr::NOTNULL, T_ADDRESS, Compile::AliasIdxRaw); |
3518 | 3517 |
3519 // Convert the store obj pointer to an int prior to doing math on it | 3518 // Convert the store obj pointer to an int prior to doing math on it |
3520 // Must use ctrl to prevent "integerized oop" existing across safepoint | 3519 // Must use ctrl to prevent "integerized oop" existing across safepoint |
3521 Node* cast = __ CastPX(__ ctrl(), adr); | 3520 Node* cast = __ CastPX(__ ctrl(), adr); |
3522 | 3521 |