Return-Path: Delivered-To: apmail-harmony-commits-archive@www.apache.org Received: (qmail 70444 invoked from network); 10 Jan 2007 20:47:31 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 10 Jan 2007 20:47:31 -0000 Received: (qmail 46031 invoked by uid 500); 10 Jan 2007 20:47:38 -0000 Delivered-To: apmail-harmony-commits-archive@harmony.apache.org Received: (qmail 46017 invoked by uid 500); 10 Jan 2007 20:47:38 -0000 Mailing-List: contact commits-help@harmony.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@harmony.apache.org Delivered-To: mailing list commits@harmony.apache.org Received: (qmail 46008 invoked by uid 99); 10 Jan 2007 20:47:38 -0000 Received: from herse.apache.org (HELO herse.apache.org) (140.211.11.133) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 10 Jan 2007 12:47:38 -0800 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 10 Jan 2007 12:47:30 -0800 Received: by eris.apache.org (Postfix, from userid 65534) id 256211A981A; Wed, 10 Jan 2007 12:46:30 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r494972 - in /harmony/enhanced/drlvm/trunk: build/make/ vm/gc_gen/javasrc/org/apache/harmony/drlvm/gc_gen/ vm/gc_gen/src/jni/ vm/jitrino/src/codegenerator/ia32/ vm/jitrino/src/optimizer/ vm/jitrino/src/translator/java/ vm/vmcore/src/kernel_... Date: Wed, 10 Jan 2007 20:46:29 -0000 To: commits@harmony.apache.org From: wjwashburn@apache.org X-Mailer: svnmailer-1.1.0 Message-Id: <20070110204630.256211A981A@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: wjwashburn Date: Wed Jan 10 12:46:28 2007 New Revision: 494972 URL: http://svn.apache.org/viewvc?view=rev&rev=494972 Log: H2652, write barrier and inlining support for gc_gen "build test" runs on winxp and RHEL4 w/ gcc4.0.2 Modified: harmony/enhanced/drlvm/trunk/build/make/deploy.xml harmony/enhanced/drlvm/trunk/vm/gc_gen/javasrc/org/apache/harmony/drlvm/gc_gen/GCHelper.java harmony/enhanced/drlvm/trunk/vm/gc_gen/src/jni/helper.cpp harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Printer.cpp harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.cpp harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/helper_inliner.cpp harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.cpp harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java Modified: harmony/enhanced/drlvm/trunk/build/make/deploy.xml URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/build/make/deploy.xml?view=diff&rev=494972&r1=494971&r2=494972 ============================================================================== --- harmony/enhanced/drlvm/trunk/build/make/deploy.xml (original) +++ harmony/enhanced/drlvm/trunk/build/make/deploy.xml Wed Jan 10 12:46:28 2007 @@ -51,6 +51,7 @@ bin/default:gc_gen + bin/default:gc_gen Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/javasrc/org/apache/harmony/drlvm/gc_gen/GCHelper.java URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/javasrc/org/apache/harmony/drlvm/gc_gen/GCHelper.java?view=diff&rev=494972&r1=494971&r2=494972 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/gc_gen/javasrc/org/apache/harmony/drlvm/gc_gen/GCHelper.java (original) +++ harmony/enhanced/drlvm/trunk/vm/gc_gen/javasrc/org/apache/harmony/drlvm/gc_gen/GCHelper.java Wed Jan 10 12:46:28 2007 @@ -22,6 +22,7 @@ import org.apache.harmony.drlvm.VMHelper; import org.vmmagic.unboxed.*; +import org.vmmagic.pragma.*; public class GCHelper { @@ -29,7 +30,7 @@ public static final int TLS_GC_OFFSET = TLSGCOffset(); - public static Address alloc(int objSize, int allocationHandle) { + public static Address alloc(int objSize, int allocationHandle) throws InlinePragma { Address TLS_BASE = VMHelper.getTlsBaseAddress(); @@ -49,6 +50,45 @@ return VMHelper.newResolvedUsingAllocHandleAndSize(objSize, allocationHandle); } + + private static final int ARRAY_LEN_OFFSET = 8; + private static final int GC_OBJECT_ALIGNMENT = 4; //TODO: EM64 or IPF could have 8! + + public static Address allocArray(int arrayLen, int elemSize, int allocationHandle) throws InlinePragma { + if (arrayLen >= 0) { + int firstElementOffset = ARRAY_LEN_OFFSET + (elemSize==8?8:4); + int size = firstElementOffset + elemSize*arrayLen; + size = (((size + (GC_OBJECT_ALIGNMENT - 1)) & (~(GC_OBJECT_ALIGNMENT - 1)))); + + Address arrayAddress = alloc(size, allocationHandle); //never null! + arrayAddress.store(arrayLen, Offset.fromInt(ARRAY_LEN_OFFSET)); + return arrayAddress; + } + return VMHelper.newVectorUsingAllocHandle(arrayLen, elemSize, allocationHandle); + } + + + + /** NOS (nursery object space) is higher in address than other spaces. + The boundary currently is produced in GC initialization. It can + be a constant in future. + */ + public static final int NOS_BOUNDARY = getNosBoundary(); + + public static void write_barrier_slot_rem(Address p_objBase, Address p_objSlot, Address p_source) throws InlinePragma { + + /* If the slot is in NOS or the target is not in NOS, we simply return*/ + if(p_objSlot.toInt() >= NOS_BOUNDARY || p_source.toInt() < NOS_BOUNDARY) { + p_objSlot.store(p_source); + return; + } + + /* Otherwise, we need remember it in native code. */ + VMHelper.writeBarrier(p_objBase, p_objSlot, p_source); + } + + + private static native int getNosBoundary(); private static native int TLSGCOffset(); } Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/jni/helper.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/jni/helper.cpp?view=diff&rev=494972&r1=494971&r2=494972 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/jni/helper.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/jni/helper.cpp Wed Jan 10 12:46:28 2007 @@ -1,7 +1,7 @@ #include #include #include "../thread/gc_thread.h" - +#include "../gen/gen.h" #ifdef __cplusplus extern "C" { @@ -16,6 +16,15 @@ { return (jint)tls_gc_offset; } + + + +JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getNosBoundary(JNIEnv *e, jclass c) +{ + return (jint)nos_boundary; +} + + #ifdef __cplusplus } Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp?view=diff&rev=494972&r1=494971&r2=494972 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp Wed Jan 10 12:46:28 2007 @@ -143,13 +143,13 @@ return fnan; } else if (!_finite(v1)){ return v0; - } + } float result = v0-float(int64(v0/v1))*v1; if (result == 0 && v1 < 0) { #ifdef PLATFORM_POSIX - return copysign(result, v1); + return copysign(result, v1); #else - return (float)_copysign(result, v1); + return (float)_copysign(result, v1); #endif } else { return result; @@ -162,13 +162,13 @@ return dnan; } else if (!_finite(v1)){ return v0; - } + } double result = v0-double(int64(v0/v1))*v1; if (result == 0 && v1 < 0) { #ifdef PLATFORM_POSIX - return copysign(result, v1); + return copysign(result, v1); #else - return _copysign(result, v1); + return _copysign(result, v1); #endif } else { return result; @@ -1492,7 +1492,7 @@ CG_OpndHandle* InstCodeSelector::ldc_i8(uint64 val) { -#ifndef _EM64T_ +#ifndef _EM64T_ return irManager.newImmOpnd(typeManager.getInt64Type(), val); #else Opnd * tmp = irManager.newOpnd(typeManager.getInt64Type()); @@ -2885,6 +2885,7 @@ case CompilationInterface::Helper_NewVector_UsingVtable: case CompilationInterface::Helper_ObjMonitorEnter: case CompilationInterface::Helper_ObjMonitorExit: + case CompilationInterface::Helper_WriteBarrier: { dstOpnd = retType==NULL ? NULL: irManager.newOpnd(retType); CallInst * callInst=irManager.newRuntimeHelperCallInst(callId, numArgs, (Opnd**)args, dstOpnd); Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Printer.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Printer.cpp?view=diff&rev=494972&r1=494971&r2=494972 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Printer.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Printer.cpp Wed Jan 10 12:46:28 2007 @@ -1184,7 +1184,10 @@ regUsages.push_back(regUsage); } - assert(irManager->getLiveAtEntry(node)->isEqual(*lsCurrent)); +#ifdef _DEBUG + BitSet* entrySet = irManager->getLiveAtEntry(node); + assert(entrySet->isEqual(*lsCurrent)); +#endif StlVector opndsAll(mm); Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.cpp?view=diff&rev=494972&r1=494971&r2=494972 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.cpp Wed Jan 10 12:46:28 2007 @@ -1876,8 +1876,8 @@ // conversion Inst* InstFactory::makeConv(Modifier mod, Type::Tag toType, Opnd* dst, Opnd* src) { Opcode opcode = Op_Conv; - if (dst->getType()->isUnmanagedPtr() && src->getType()->isObject() - || dst->getType()->isObject() && src->getType()->isUnmanagedPtr()) + if ((dst->getType()->isUnmanagedPtr() && src->getType()->isObject()) + || (dst->getType()->isObject() && src->getType()->isUnmanagedPtr())) { opcode = Op_ConvUnmanaged; } Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/helper_inliner.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/helper_inliner.cpp?view=diff&rev=494972&r1=494971&r2=494972 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/helper_inliner.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/helper_inliner.cpp Wed Jan 10 12:46:28 2007 @@ -44,6 +44,7 @@ DECLARE_STANDARD_HELPER_FLAGS(newArray); DECLARE_STANDARD_HELPER_FLAGS(objMonEnter); DECLARE_STANDARD_HELPER_FLAGS(objMonExit); +DECLARE_STANDARD_HELPER_FLAGS(wb); }; @@ -92,6 +93,10 @@ READ_STANDARD_HELPER_FLAGS(objMonExit); flags.objMonExit_signature = "(Ljava/lang/Object;)V"; + + READ_STANDARD_HELPER_FLAGS(wb); + flags.wb_signature = "(Lorg/vmmagic/unboxed/Address;Lorg/vmmagic/unboxed/Address;Lorg/vmmagic/unboxed/Address;)V"; + } @@ -152,6 +157,7 @@ DECLARE_HELPER_INLINER(NewArrayHelperInliner, newArray) DECLARE_HELPER_INLINER(ObjMonitorEnterHelperInliner, objMonEnter) DECLARE_HELPER_INLINER(ObjMonitorExitHelperInliner, objMonExit) +DECLARE_HELPER_INLINER(WriteBarrierHelperInliner, wb) void HelperInlinerSession::_run(IRManager& irm) { CompilationContext* cc = getCompilationContext(); @@ -193,6 +199,12 @@ helperInliners.push_back(new (tmpMM) ObjMonitorExitHelperInliner(this, tmpMM, cc, inst)); } break; + case Op_TauStRef: + if (flags.wb_doInlining && nodePercent >= flags.wb_hotnessPercentToInline) { + helperInliners.push_back(new (tmpMM) WriteBarrierHelperInliner(this, tmpMM, cc, inst)); + } + break; + default: break; } } @@ -268,7 +280,7 @@ //add all methods with pragma inline into the list. const Nodes& nodesInRegion = regionToInline->getIRManager().getFlowGraph().getNodes(); for (Nodes::const_iterator it = nodesInRegion.begin(), end = nodesInRegion.end(); it!=end; ++it) { - Node* node = *it; + Node* node = *it; for (Inst* inst = (Inst*)node->getFirstInst(); inst!=NULL; inst = inst->getNextInst()) { if (inst->isMethodCall()) { MethodCallInst* methodCall = inst->asMethodCallInst(); @@ -447,6 +459,49 @@ inlineVMHelper(call); #endif } + +void WriteBarrierHelperInliner::doInline() { +#if defined (_EM64T_) || defined (_IPF_) + return; +#else + assert(inst->getOpcode() == Op_TauStRef); + + Opnd* srcOpnd = inst->getSrc(0); + Opnd* ptrOpnd = inst->getSrc(1); + Opnd* objBaseOpnd = inst->getSrc(2); + assert(srcOpnd->getType()->isObject()); + assert(ptrOpnd->getType()->isPtr()); + assert(objBaseOpnd->getType()->isObject()); + Opnd* tauSafeOpnd = opndManager->createSsaTmpOpnd(typeManager->getTauType()); + instFactory->makeTauSafe(tauSafeOpnd)->insertBefore(inst); + Opnd* args[3] = {objBaseOpnd, ptrOpnd, srcOpnd}; + MethodCallInst* call = instFactory->makeDirectCall(opndManager->getNullOpnd(), tauSafeOpnd, tauSafeOpnd, 3, args, method)->asMethodCallInst(); + call->insertBefore(inst); + inst->unlink(); + + if (call != call->getNode()->getLastInst()) { + cfg->splitNodeAtInstruction(call, true, true, instFactory->makeLabel()); + } + + //every call must have exception edge -> add it + if (call->getNode()->getExceptionEdge() == NULL) { + Node* node = call->getNode(); + Node* dispatchNode = node->getUnconditionalEdgeTarget()->getExceptionEdgeTarget(); + if (dispatchNode == NULL) { + dispatchNode = cfg->getUnwindNode(); + if (dispatchNode == NULL) { + dispatchNode = cfg->createDispatchNode(instFactory->makeLabel()); + cfg->setUnwindNode(dispatchNode); + cfg->addEdge(dispatchNode, cfg->getExitNode()); + } + } + cfg->addEdge(node, dispatchNode); + } + + inlineVMHelper(call); +#endif +} + }//namespace Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.cpp?view=diff&rev=494972&r1=494971&r2=494972 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.cpp Wed Jan 10 12:46:28 2007 @@ -532,7 +532,15 @@ { Opnd* dst = inst->getDst(); Opnd* src = callInst->getSrc(j+2); // omit taus - Inst* copy = _instFactory.makeCopy(dst, src); + Inst* copy = NULL; + // todo: make translators isMagicClass and convertMagic2HIRType methods public + // use these methods here + if (dst->getType()->isUnmanagedPtr()==src->getType()->isUnmanagedPtr()) { + copy = _instFactory.makeCopy(dst, src); + } else { + Modifier mod = Modifier(Overflow_None)|Modifier(Exception_Never)|Modifier(Strict_No); + copy = _instFactory.makeConv(mod, dst->getType()->tag, dst, src); + } copy->insertBefore(inst); inst->unlink(); inst = copy; Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp?view=diff&rev=494972&r1=494971&r2=494972 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp Wed Jan 10 12:46:28 2007 @@ -4019,6 +4019,12 @@ return; } + if (!strcmp(mname,"writeBarrier")) { + assert(numArgs == 3); + irBuilder.genVMHelperCall(CompilationInterface::Helper_WriteBarrier, resType, numArgs, srcOpnds); + return; + } + assert(0); } Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java?view=diff&rev=494972&r1=494971&r2=494972 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java (original) +++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java Wed Jan 10 12:46:28 2007 @@ -38,6 +38,7 @@ public static void monitorExit(Object obj) {fail();} + public static void writeBarrier(Address objBase, Address objSlot, Address source) {fail();} protected static void fail() {throw new RuntimeException("Not supported!");}