# HG changeset patch # User Christian Wimmer # Date 1326857729 28800 # Node ID 21400bafb3ffe679049e172b65f0edd6608c1eb3 # Parent adce3fb40114cb6358067e6b28ce387fc5100c25 Enforce that one fixed register cannot be a temporary operand multiple times with different kinds diff -r adce3fb40114 -r 21400bafb3ff graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/alloc/util/LIRVerifier.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/alloc/util/LIRVerifier.java Tue Jan 17 19:33:48 2012 -0800 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/alloc/util/LIRVerifier.java Tue Jan 17 19:35:29 2012 -0800 @@ -92,11 +92,13 @@ private LIRBlock curBlock; private Object curInstruction; + private BitSet curRegistersDefined; private void verify() { PhiValueProcedure useProc = new PhiValueProcedure() { @Override public CiValue doValue(CiValue value, OperandMode mode, EnumSet flags) { return use(value, mode, flags); } }; ValueProcedure defProc = new ValueProcedure() { @Override public CiValue doValue(CiValue value, OperandMode mode, EnumSet flags) { return def(value, mode, flags); } }; + curRegistersDefined = new BitSet(); for (LIRBlock block : lir.linearScanOrder()) { curBlock = block; curVariablesLive = new BitSet(); @@ -121,6 +123,7 @@ curRegistersLive[register.number] = null; } } + curRegistersDefined.clear(); op.forEachAlive(useProc); op.forEachState(useProc); op.forEachTemp(defProc); @@ -189,10 +192,19 @@ } else if (beforeRegisterAllocation && isAllocatableRegister(value)) { int regNum = asRegister(value).number; - if (mode == OperandMode.Output) { - curRegistersLive[regNum] = value; - } else { - curRegistersLive[regNum] = null; + if (curRegistersDefined.get(regNum)) { + TTY.println("block %s instruction %s", curBlock, curInstruction); + TTY.println("ERROR: Same register defined twice in the same instruction: %s", value); + throw Util.shouldNotReachHere(); + } + curRegistersDefined.set(regNum); + + if (beforeRegisterAllocation) { + if (mode == OperandMode.Output) { + curRegistersLive[regNum] = value; + } else { + curRegistersLive[regNum] = null; + } } } return value; diff -r adce3fb40114 -r 21400bafb3ff graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/ri/HotSpotXirGenerator.java --- a/graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/ri/HotSpotXirGenerator.java Tue Jan 17 19:33:48 2012 -0800 +++ b/graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/ri/HotSpotXirGenerator.java Tue Jan 17 19:35:29 2012 -0800 @@ -236,7 +236,7 @@ XirParameter receiver = asm.createInputParameter("receiver", CiKind.Object); XirParameter addr = asm.createConstantInputParameter("addr", target.wordKind); XirOperand temp = asm.createRegisterTemp("temp", target.wordKind, AMD64.rax); - XirOperand tempO = asm.createRegisterTemp("tempO", CiKind.Object, AMD64.rax); + XirOperand tempO = asm.createRegister("tempO", CiKind.Object, AMD64.rax); if (is(NULL_CHECK, flags)) { asm.mark(MARK_IMPLICIT_NULL); @@ -257,7 +257,7 @@ XirParameter receiver = asm.createInputParameter("receiver", CiKind.Object); XirParameter addr = asm.createConstantInputParameter("addr", target.wordKind); XirOperand temp = asm.createRegisterTemp("temp", target.wordKind, AMD64.rax); - XirOperand tempO = asm.createRegisterTemp("tempO", CiKind.Object, AMD64.rax); + XirOperand tempO = asm.createRegister("tempO", CiKind.Object, AMD64.rax); if (is(NULL_CHECK, flags)) { asm.mark(MARK_IMPLICIT_NULL); @@ -448,9 +448,9 @@ XirOperand type = asm.createInputParameter("type", CiKind.Object); XirOperand temp1 = asm.createRegisterTemp("temp1", target.wordKind, AMD64.rcx); - XirOperand temp1o = asm.createRegisterTemp("temp1o", CiKind.Object, AMD64.rcx); + XirOperand temp1o = asm.createRegister("temp1o", CiKind.Object, AMD64.rcx); XirOperand temp2 = asm.createRegisterTemp("temp2", target.wordKind, AMD64.rbx); - XirOperand temp2i = asm.createRegisterTemp("temp2i", CiKind.Int, AMD64.rbx); + XirOperand temp2i = asm.createRegister("temp2i", CiKind.Int, AMD64.rbx); useRegisters(asm, AMD64.rsi); XirLabel tlabFull = asm.createOutOfLineLabel("tlab full"); XirLabel resume = asm.createInlineLabel("resume"); @@ -533,7 +533,7 @@ // Registers rsi, rcx, rdi, and rax are needed by the runtime call. // Hub needs to be on rdx, length on rbx. XirOperand temp1 = asm.createRegisterTemp("temp1", target.wordKind, AMD64.rcx); - XirOperand temp1o = asm.createRegisterTemp("temp1o", CiKind.Object, AMD64.rcx); + XirOperand temp1o = asm.createRegister("temp1o", CiKind.Object, AMD64.rcx); XirOperand temp2 = asm.createRegisterTemp("temp2", target.wordKind, AMD64.rax); XirOperand temp3 = asm.createRegisterTemp("temp3", target.wordKind, AMD64.rdi); XirOperand size = asm.createRegisterTemp("size", CiKind.Int, AMD64.rsi); @@ -631,7 +631,7 @@ asm.mov(hub, asm.createConstantInputParameter("hub", CiKind.Object)); asm.mov(rank, asm.i(dimensions)); - useRegisters(asm, AMD64.rax); + // not necessary because we already have a temp in rax: useRegisters(asm, AMD64.rax); asm.callRuntime(config.newMultiArrayStub, result); return asm.finishTemplate("multiNewArray" + dimensions); }