Index: vm/jitrino/config/ia32/client.emconf =================================================================== --- vm/jitrino/config/ia32/client.emconf (revision 655790) +++ vm/jitrino/config/ia32/client.emconf (working copy) @@ -71,7 +71,6 @@ -XX:jit.CD_OPT.arg.codegen.regalloc.bp_regalloc2.regs=ALL_XMM -XX:jit.CD_OPT.arg.codegen.btr.insertCMOVs=no -XX:jit.CD_OPT.arg.codegen.btr.removeConstCompare=yes --XX:jit.arg.codegen.emitter.align=4 #system properties -Djava.compiler=client Index: vm/jitrino/config/ia32/opt.emconf =================================================================== --- vm/jitrino/config/ia32/opt.emconf (revision 655790) +++ vm/jitrino/config/ia32/opt.emconf (working copy) @@ -46,7 +46,6 @@ -XX:jit.CS_OPT.arg.codegen.btr.insertCMOVs=no -XX:jit.CS_OPT.arg.codegen.btr.removeConstCompare=yes --XX:jit.arg.codegen.emitter.align=4 #-XX:jit.CS_OPT.arg.log.irdump.file=log/%jit%/%log%/%seqnb%_%class%.%method%.log #-XX:jit.CS_OPT.arg.log=ct,ir,irdump,all Index: vm/jitrino/config/ia32/server.emconf =================================================================== --- vm/jitrino/config/ia32/server.emconf (revision 655790) +++ vm/jitrino/config/ia32/server.emconf (working copy) @@ -138,7 +138,6 @@ -XX:jit.SD2_OPT.arg.codegen.btr.insertCMOVs=no -XX:jit.SD2_OPT.arg.codegen.btr.removeConstCompare=yes -XX:jit.SD2_OPT.arg.codegen.btr.eliminateSignCheck=yes --XX:jit.arg.codegen.emitter.align=4 #system properties -Djava.compiler=server Index: vm/jitrino/config/ia32/server_aggressive.emconf =================================================================== --- vm/jitrino/config/ia32/server_aggressive.emconf (revision 655790) +++ vm/jitrino/config/ia32/server_aggressive.emconf (working copy) @@ -131,7 +131,6 @@ -XX:jit.SD2_OPT.arg.codegen.dce1.early=yes -XX:jit.SD2_OPT.arg.codegen.btr.insertCMOVs=no -XX:jit.SD2_OPT.arg.codegen.btr.removeConstCompare=yes --XX:jit.arg.codegen.emitter.align=4 #system properties -Djava.compiler=server @@ -161,3 +160,4 @@ -XX:jit.arg.lazyResolution=off -XX:jit.arg.opt_init.rept_aggressive=true + Index: vm/jitrino/config/ia32/server_static.emconf =================================================================== --- vm/jitrino/config/ia32/server_static.emconf (revision 655790) +++ vm/jitrino/config/ia32/server_static.emconf (working copy) @@ -89,7 +89,6 @@ -XX:jit.SS_OPT.arg.codegen.dce1.early=yes -XX:jit.SS_OPT.arg.codegen.btr.insertCMOVs=no -XX:jit.SS_OPT.arg.codegen.btr.removeConstCompare=yes --XX:jit.arg.codegen.emitter.align=4 #system properties -Djava.compiler=server static Index: vm/jitrino/src/codegenerator/ia32/Ia32CodeEmitter.cpp =================================================================== --- vm/jitrino/src/codegenerator/ia32/Ia32CodeEmitter.cpp (revision 655790) +++ vm/jitrino/src/codegenerator/ia32/Ia32CodeEmitter.cpp (working copy) @@ -467,19 +467,35 @@ memset(codeStreamStart, 0xCC, maxMethodSize); #endif - int alignment = getIntArg("align", 0); + int exCountRelation = getIntArg("exCountRelation", 2); LoopTree * lt = irManager->getFlowGraph()->getLoopTree(); uint8 * ip = codeStreamStart; + + bool linked = true; + double prevExecCount = -1; for( BasicBlock * bb = (BasicBlock*)irManager->getFlowGraph()->getEntryNode(); bb != NULL; bb=bb->getLayoutSucc()) { - assert(bb->getFirstInst()!=NULL); - if (alignment && lt->isLoopHeader(bb) && ((POINTER_SIZE_INT)ip & (alignment-1))) { - unsigned align = alignment - (unsigned)((POINTER_SIZE_INT)ip & (alignment-1)); + double curExecCount = bb->getExecCount(); + + POINTER_SIZE_INT lowBits = (POINTER_SIZE_INT) (ip - codeStreamStart) & 15; + if ( lowBits && + ((prevExecCount > 0 && curExecCount > exCountRelation*prevExecCount) || !linked) ) + { + // aligning basic block when it is much hotter than its layout predecessor + // or unreachable from its layout predecessor + unsigned align = 16 - (unsigned)lowBits; ip = (uint8*)EncoderBase::nops((char*)ip, align); + //bb->prependInst(irManager->newInst(Mnemonic_INT3)); } + prevExecCount = curExecCount; + BasicBlock* layoutSucc = bb->getLayoutSucc(); + linked = (bool) bb->findEdgeTo(true, layoutSucc); + + assert(bb->getFirstInst()!=NULL); + uint8 * blockStartIp = ip; assert(fit32(blockStartIp-codeStreamStart)); bb->setCodeOffset( (uint32)(blockStartIp-codeStreamStart) ); @@ -558,7 +574,11 @@ //________________________________________________________________________________________ void CodeEmitter::packCode() { bool newOpndsCreated = false; + + int exCountRelation = getIntArg("exCountRelation", 2); + for( BasicBlock * bb = (BasicBlock*)irManager->getFlowGraph()->getEntryNode(), * succ; bb != NULL; bb = succ) { + succ = (BasicBlock*)bb->getLayoutSucc(); Inst* inst = (Inst*)bb->getLastInst(); if (inst != NULL){ @@ -574,7 +594,7 @@ uint8 * targetCodeStartAddr = (uint8*)bbTarget->getCodeStartAddr(); uint32 targetOpndIndex = ((ControlTransferInst*)inst)->getTargetOpndIndex(); int64 offset=targetCodeStartAddr-instCodeEndAddr; - if (offset >= -128 && offset < 127 && inst->getOpnd(targetOpndIndex)->getSize() != OpndSize_8) { + if (offset >= -128 && offset < 123 && inst->getOpnd(targetOpndIndex)->getSize() != OpndSize_8) { inst->setOpnd(targetOpndIndex, irManager->newImmOpnd(irManager->getTypeFromTag(Type::Int8), offset)); uint8 * newInstCodeEndAddr = inst->emit(instCodeStartAddr); bb->setCodeSize(bb->getCodeSize() + (uint32)(newInstCodeEndAddr - instCodeEndAddr)); @@ -590,14 +610,26 @@ int succCodeSize = succ->getCodeSize(); int bbDisplacement = succCodeOffset - bbCodeOffset - bbCodeSize; if (bbDisplacement != 0){ - uint8 * ps = (uint8*)irManager->getCodeStartAddr() + succCodeOffset; - uint8 * pd = ps - bbDisplacement; - uint8 * pn = ps + succCodeSize; - while (ps < pn) - *pd++ = *ps++; - succ->setCodeOffset(succCodeOffset - bbDisplacement); + + double curExecCount = bb->getExecCount(); + double nextExecCount = succ->getExecCount(); + if ( nextExecCount > exCountRelation*curExecCount || bb->findEdgeTo(true, succ) == NULL ) + { + uint8 * bbEnd = (uint8*)irManager->getCodeStartAddr() + bbCodeOffset + bbCodeSize; + EncoderBase::nops((char*)bbEnd, (bbDisplacement & 15)); + bbDisplacement-= (bbDisplacement & 15); + } + //else + { + uint8 * ps = (uint8*)irManager->getCodeStartAddr() + succCodeOffset; + uint8 * pd = ps - bbDisplacement; + uint8 * pn = ps + succCodeSize; + while (ps < pn) + *pd++ = *ps++; + succ->setCodeOffset(succCodeOffset - bbDisplacement); + } } - } + } } } if (newOpndsCreated) @@ -676,7 +708,7 @@ #endif { inst->getOpnd(targetOpndIndex)->assignImmValue(offset); - // re-emit the instruction: + // re-emit the instruction: inst->emit(instCodeStartAddr); if (inst->hasKind(Inst::Kind_CallInst) && md){ @@ -1102,3 +1134,8 @@ + + + + +