Skip to content

Commit 0e7d887

Browse files
committed
8202379: ARM32 is broken after JDK-8201543 (Modularize C1 GC barriers)
Reviewed-by: aph, eosterlund
1 parent a4c5934 commit 0e7d887

File tree

5 files changed

+14
-39
lines changed

5 files changed

+14
-39
lines changed

src/hotspot/cpu/arm/c1_LIRGenerator_arm.cpp

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -375,32 +375,17 @@ LIR_Address* LIRGenerator::generate_address(LIR_Opr base, LIR_Opr index,
375375
}
376376

377377

378-
LIR_Address* LIRGenerator::emit_array_address(LIR_Opr array_opr, LIR_Opr index_opr,
379-
BasicType type, bool needs_card_mark) {
378+
LIR_Address* LIRGenerator::emit_array_address(LIR_Opr array_opr, LIR_Opr index_opr, BasicType type) {
380379
int base_offset = arrayOopDesc::base_offset_in_bytes(type);
381380
int elem_size = type2aelembytes(type);
382381

383382
if (index_opr->is_constant()) {
384383
int offset = base_offset + index_opr->as_constant_ptr()->as_jint() * elem_size;
385-
if (needs_card_mark) {
386-
LIR_Opr base_opr = new_pointer_register();
387-
add_large_constant(array_opr, offset, base_opr);
388-
return new LIR_Address(base_opr, (intx)0, type);
389-
} else {
390-
return generate_address(array_opr, offset, type);
391-
}
384+
return generate_address(array_opr, offset, type);
392385
} else {
393386
assert(index_opr->is_register(), "must be");
394387
int scale = exact_log2(elem_size);
395-
if (needs_card_mark) {
396-
LIR_Opr base_opr = new_pointer_register();
397-
LIR_Address* addr = make_address(base_opr, index_opr, (LIR_Address::Scale)scale, type);
398-
__ add(array_opr, LIR_OprFact::intptrConst(base_offset), base_opr);
399-
__ add(base_opr, LIR_OprFact::address(addr), base_opr); // add with shifted/extended register
400-
return new LIR_Address(base_opr, type);
401-
} else {
402-
return generate_address(array_opr, index_opr, scale, base_offset, type);
403-
}
388+
return generate_address(array_opr, index_opr, scale, base_offset, type);
404389
}
405390
}
406391

@@ -1024,7 +1009,7 @@ LIR_Opr LIRGenerator::atomic_xchg(BasicType type, LIR_Opr addr, LIRItem& value)
10241009
value.load_item();
10251010
assert(type == T_INT || is_oop LP64_ONLY( || type == T_LONG ), "unexpected type");
10261011
LIR_Opr tmp = (UseCompressedOops && is_oop) ? new_pointer_register() : LIR_OprFact::illegalOpr;
1027-
__ xchg(addr_ptr, data, dst, tmp);
1012+
__ xchg(addr, value.result(), result, tmp);
10281013
return result;
10291014
}
10301015

src/hotspot/cpu/arm/c1_Runtime1_arm.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -352,11 +352,11 @@ static void restore_live_registers_without_return(StubAssembler* sasm, bool rest
352352
}
353353

354354
void StubAssembler::save_live_registers() {
355-
save_live_registers(this);
355+
::save_live_registers(this);
356356
}
357357

358358
void StubAssembler::restore_live_registers_without_return() {
359-
restore_live_registers_without_return(this);
359+
::restore_live_registers_without_return(this);
360360
}
361361

362362
void Runtime1::initialize_pd() {

src/hotspot/cpu/arm/gc/g1/g1BarrierSetAssembler_arm.cpp

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "asm/macroAssembler.inline.hpp"
2727
#include "gc/g1/g1BarrierSet.hpp"
2828
#include "gc/g1/g1BarrierSetAssembler.hpp"
29+
#include "gc/g1/g1ThreadLocalData.hpp"
2930
#include "gc/g1/g1CardTable.hpp"
3031
#include "gc/g1/heapRegion.hpp"
3132
#include "interpreter/interp_masm.hpp"
@@ -175,15 +176,7 @@ void G1BarrierSetAssembler::generate_c1_pre_barrier_runtime_stub(StubAssembler*
175176
// Input:
176177
// - pre_val pushed on the stack
177178

178-
__ set_info("g1_pre_barrier_slow_id", dont_gc_arguments);
179-
180-
BarrierSet* bs = BarrierSet::barrier_set();
181-
if (bs->kind() != BarrierSet::G1BarrierSet) {
182-
__ mov(R0, (int)id);
183-
__ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), R0);
184-
__ should_not_reach_here();
185-
break;
186-
}
179+
__ set_info("g1_pre_barrier_slow_id", false);
187180

188181
// save at least the registers that need saving if the runtime is called
189182
#ifdef AARCH64
@@ -251,15 +244,7 @@ void G1BarrierSetAssembler::generate_c1_post_barrier_runtime_stub(StubAssembler*
251244
// Input:
252245
// - store_addr, pushed on the stack
253246

254-
__ set_info("g1_post_barrier_slow_id", dont_gc_arguments);
255-
256-
BarrierSet* bs = BarrierSet::barrier_set();
257-
if (bs->kind() != BarrierSet::G1BarrierSet) {
258-
__ mov(R0, (int)id);
259-
__ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), R0);
260-
__ should_not_reach_here();
261-
break;
262-
}
247+
__ set_info("g1_post_barrier_slow_id", false);
263248

264249
Label done;
265250
Label recheck;

src/hotspot/cpu/arm/gc/g1/g1BarrierSetAssembler_arm.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class G1BarrierSetAssembler: public ModRefBarrierSetAssembler {
4242
Register addr, Register count, Register tmp);
4343

4444
#ifdef COMPILER1
45+
public:
4546
void gen_pre_barrier_stub(LIR_Assembler* ce, G1PreBarrierStub* stub);
4647
void gen_post_barrier_stub(LIR_Assembler* ce, G1PostBarrierStub* stub);
4748

src/hotspot/share/c1/c1_LIRGenerator.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,10 @@ class LIRGenerator: public InstructionVisitor, public BlockClosure {
302302
LIR_Opr atomic_xchg(BasicType type, LIR_Opr addr, LIRItem& new_value);
303303
LIR_Opr atomic_add(BasicType type, LIR_Opr addr, LIRItem& new_value);
304304

305+
#ifdef CARDTABLEBARRIERSET_POST_BARRIER_HELPER
306+
virtual void CardTableBarrierSet_post_barrier_helper(LIR_OprDesc* addr, LIR_Const* card_table_base);
307+
#endif
308+
305309
// specific implementations
306310
void array_store_check(LIR_Opr value, LIR_Opr array, CodeEmitInfo* store_check_info, ciMethod* profiled_method, int profiled_bci);
307311

0 commit comments

Comments
 (0)