Mercurial > hg > truffle
changeset 4290:21400bafb3ff
Enforce that one fixed register cannot be a temporary operand multiple times with different kinds
author | Christian Wimmer <Christian.Wimmer@Oracle.com> |
---|---|
date | Tue, 17 Jan 2012 19:35:29 -0800 |
parents | adce3fb40114 |
children | 015c53fefd3a |
files | graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/alloc/util/LIRVerifier.java graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/ri/HotSpotXirGenerator.java |
diffstat | 2 files changed, 22 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- 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<OperandFlag> flags) { return use(value, mode, flags); } }; ValueProcedure defProc = new ValueProcedure() { @Override public CiValue doValue(CiValue value, OperandMode mode, EnumSet<OperandFlag> 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;
--- 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); }