# HG changeset patch # User Stefan Anzinger # Date 1406346868 25200 # Node ID 8c70d65ec04a746fb25fb6fc840867406c8677dc # Parent fa14ceabaf152eb1fe7ada2fcda44ac0f5bbc898 [SPARC] Fix issues when deoptimizing with floats in local scope. # SIGSEGV (0xb) at pc=0xffffffff35d71608, pid=2280, tid=2 # V [libjvm.so+0x1871608] StackValue*StackValue::create_stack_value(const frame*,const RegisterMap*,ScopeValue*)+0x360 diff -r fa14ceabaf15 -r 8c70d65ec04a graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java Fri Jul 25 20:48:28 2014 -0700 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java Fri Jul 25 20:54:28 2014 -0700 @@ -172,6 +172,7 @@ public CompilationResultBuilder newCompilationResultBuilder(LIRGenerationResult lirGenRes, CompilationResult compilationResult, CompilationResultBuilderFactory factory) { SPARCHotSpotLIRGenerationResult gen = (SPARCHotSpotLIRGenerationResult) lirGenRes; FrameMap frameMap = gen.getFrameMap(); + LIR lir = gen.getLIR(); assert gen.getDeoptimizationRescueSlot() != null || frameMap.frameNeedsAllocating() : "method that can deoptimize must have a frame"; Stub stub = gen.getStub(); @@ -186,10 +187,10 @@ } if (stub != null) { - // SPARC stubs always enter a frame which saves the registers. - Set destroyedRegisters = Collections.emptySet(); - Map calleeSaveInfo = Collections.emptyMap(); - updateStub(stub, destroyedRegisters, calleeSaveInfo, frameMap); + // Even on sparc we need to save floating point registers + Set definedRegisters = gatherDefinedRegisters(lir); + Map calleeSaveInfo = gen.getCalleeSaveInfo(); + updateStub(stub, definedRegisters, calleeSaveInfo, frameMap); } return crb; diff -r fa14ceabaf15 -r 8c70d65ec04a graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java Fri Jul 25 20:48:28 2014 -0700 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java Fri Jul 25 20:54:28 2014 -0700 @@ -27,6 +27,8 @@ import static com.oracle.graal.hotspot.HotSpotGraalRuntime.*; import static com.oracle.graal.sparc.SPARC.*; +import java.util.*; + import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.*; @@ -46,6 +48,7 @@ final HotSpotVMConfig config; private HotSpotLockStack lockStack; + private LIRFrameState currentRuntimeCallInfo; public SPARCHotSpotLIRGenerator(HotSpotProviders providers, HotSpotVMConfig config, CallingConvention cc, LIRGenerationResult lirGenRes) { super(providers, cc, lirGenRes); @@ -99,6 +102,12 @@ } @Override + protected void emitForeignCall(ForeignCallLinkage linkage, Value result, Value[] arguments, Value[] temps, LIRFrameState info) { + currentRuntimeCallInfo = info; + super.emitForeignCall(linkage, result, arguments, temps, info); + } + + @Override public Variable emitForeignCall(ForeignCallLinkage linkage, LIRFrameState state, Value... args) { HotSpotForeignCallLinkage hotspotLinkage = (HotSpotForeignCallLinkage) linkage; Variable result; @@ -292,6 +301,11 @@ Variable result = super.emitForeignCall(linkage, null, threadRegister.asValue(LIRKind.value(Kind.Long)), trapRequest); append(new SPARCHotSpotCRuntimeCallEpilogueOp(config.threadLastJavaSpOffset(), config.threadLastJavaPcOffset(), config.threadJavaFrameAnchorFlagsOffset(), threadRegister)); + Map calleeSaveInfo = ((SPARCHotSpotLIRGenerationResult) getResult()).getCalleeSaveInfo(); + assert currentRuntimeCallInfo != null; + assert !calleeSaveInfo.containsKey(currentRuntimeCallInfo); + calleeSaveInfo.put(currentRuntimeCallInfo, saveRegisterOp); + return result; } diff -r fa14ceabaf15 -r 8c70d65ec04a graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java --- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java Fri Jul 25 20:48:28 2014 -0700 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java Fri Jul 25 20:54:28 2014 -0700 @@ -389,11 +389,11 @@ const2reg(crb, masm, result, (Constant) input); } else if (isStackSlot(result)) { // Move a Constant to a stack slot (Probably a 7th output parameter) - Value scratch = input.getKind() == Kind.Float || input.getKind() == Kind.Double ? f30.asValue() : g5.asValue(); + Value scratch = input.getKind() == Kind.Float || input.getKind() == Kind.Double ? f30.asValue(input.getLIRKind()) : g5.asValue(input.getLIRKind()); const2reg(crb, masm, scratch, (Constant) input); reg2stack(crb, masm, result, scratch); } else { - throw GraalInternalError.shouldNotReachHere("Result is a : " + result); + throw GraalInternalError.shouldNotReachHere("Result is a: " + result); } } else { throw GraalInternalError.shouldNotReachHere(); @@ -443,7 +443,7 @@ } break; default: - throw GraalInternalError.shouldNotReachHere(); + throw GraalInternalError.shouldNotReachHere("Input is a: " + input.getKind()); } } @@ -451,6 +451,9 @@ SPARCAddress dst = (SPARCAddress) crb.asAddress(result); Register src = asRegister(input); switch (input.getKind()) { + case Char: + case Byte: + case Boolean: case Int: new Stw(src, dst).emit(masm); break; @@ -465,7 +468,7 @@ new Stdf(src, dst).emit(masm); break; default: - throw GraalInternalError.shouldNotReachHere(); + throw GraalInternalError.shouldNotReachHere("Input is a: " + input.getKind() + "(" + input + ")"); } } @@ -487,7 +490,7 @@ new Lddf(src, dst).emit(masm); break; default: - throw GraalInternalError.shouldNotReachHere(); + throw GraalInternalError.shouldNotReachHere("Input is a: " + input.getKind()); } } diff -r fa14ceabaf15 -r 8c70d65ec04a graal/com.oracle.graal.sparc/src/com/oracle/graal/sparc/SPARC.java --- a/graal/com.oracle.graal.sparc/src/com/oracle/graal/sparc/SPARC.java Fri Jul 25 20:48:28 2014 -0700 +++ b/graal/com.oracle.graal.sparc/src/com/oracle/graal/sparc/SPARC.java Fri Jul 25 20:54:28 2014 -0700 @@ -189,9 +189,14 @@ * Stack bias for stack and frame pointer loads. */ public static final int STACK_BIAS = 0x7ff; + /** + * In fact there are 64 single floating point registers, 32 of them could be accessed. TODO: + * Improve handling of these float registers + */ + public static final int FLOAT_REGISTER_COUNT = 64; public SPARC() { - super("SPARC", 8, ByteOrder.BIG_ENDIAN, false, allRegisters, LOAD_STORE | STORE_STORE, 1, r31.encoding + 1, 8); + super("SPARC", 8, ByteOrder.BIG_ENDIAN, false, allRegisters, LOAD_STORE | STORE_STORE, 1, r31.encoding + FLOAT_REGISTER_COUNT + 1, 8); } @Override diff -r fa14ceabaf15 -r 8c70d65ec04a src/share/vm/graal/graalCodeInstaller.cpp --- a/src/share/vm/graal/graalCodeInstaller.cpp Fri Jul 25 20:48:28 2014 -0700 +++ b/src/share/vm/graal/graalCodeInstaller.cpp Fri Jul 25 20:54:28 2014 -0700 @@ -68,6 +68,11 @@ return as_XMMRegister(remainder)->as_VMReg(); } #endif +#ifdef TARGET_ARCH_sparc + if (remainder < FloatRegisterImpl::number_of_registers) { + return as_FloatRegister(remainder)->as_VMReg(); + } +#endif ShouldNotReachHere(); return NULL; } @@ -129,6 +134,13 @@ } } #endif +#ifdef TARGET_ARCH_sparc + for (jint i = 0; i < FloatRegisterImpl::number_of_registers; i++) { + VMReg reg = as_FloatRegister(i)->as_VMReg(); + int idx = RegisterImpl::number_of_registers + i; + set_vmreg_oops(map, reg, register_map, idx); + } +#endif } for (jint i = 0; i < bitset_size(frame_map) / 3; i++) { @@ -210,6 +222,7 @@ if (value->is_a(RegisterValue::klass())) { jint number = code_Register::number(RegisterValue::reg(value)); + jint encoding = code_Register::encoding(RegisterValue::reg(value)); if (number < RegisterImpl::number_of_registers) { if (type == T_INT || type == T_FLOAT || type == T_SHORT || type == T_CHAR || type == T_BOOLEAN || type == T_BYTE || type == T_ADDRESS) { locationType = Location::int_in_long; @@ -239,9 +252,9 @@ return value; #else #ifdef TARGET_ARCH_sparc - ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, as_FloatRegister(number)->as_VMReg())); + ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, as_FloatRegister(encoding)->as_VMReg())); if (type == T_DOUBLE) { - second = value; + second = new ConstantIntValue(0); } return value; #else diff -r fa14ceabaf15 -r 8c70d65ec04a src/share/vm/graal/graalJavaAccess.hpp --- a/src/share/vm/graal/graalJavaAccess.hpp Fri Jul 25 20:48:28 2014 -0700 +++ b/src/share/vm/graal/graalJavaAccess.hpp Fri Jul 25 20:54:28 2014 -0700 @@ -232,6 +232,7 @@ end_class \ start_class(code_Register) \ int_field(code_Register, number) \ + int_field(code_Register, encoding) \ end_class \ start_class(StackSlot) \ int_field(StackSlot, offset) \