From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 72714 invoked by alias); 25 Mar 2015 23:13:03 -0000 Mailing-List: contact kawa-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: kawa-owner@sourceware.org Received: (qmail 72699 invoked by uid 89); 25 Mar 2015 23:13:02 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.2 X-HELO: mail.theptrgroup.com Received: from Unknown (HELO mail.theptrgroup.com) (71.178.251.9) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 25 Mar 2015 23:13:01 +0000 Received: from [10.11.21.50] (unknown [10.11.21.50]) by mail.theptrgroup.com (Postfix) with ESMTPS id 945F8E0910 for ; Wed, 25 Mar 2015 19:12:53 -0400 (EDT) From: Jamison Hope Content-Type: multipart/mixed; boundary="Apple-Mail=_C1E10345-9DF8-4AAC-808F-A080178CE909" Subject: [PATCH] further optimization for call-with-values Message-Id: <83329DDE-2C17-4907-A588-B4587264A889@theptrgroup.com> Date: Wed, 25 Mar 2015 23:13:00 -0000 To: Kawa mailing list Mime-Version: 1.0 (Mac OS X Mail 6.6 \(1510\)) X-IsSubscribed: yes X-SW-Source: 2015-q1/txt/msg00064.txt.bz2 --Apple-Mail=_C1E10345-9DF8-4AAC-808F-A080178CE909 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii Content-length: 352 The attached patch optimizes the call-with-values case where the consumer is a single-argument procedure to rewrite (call-with-values producer consumer) as (consumer (producer)). It works when the consumer is a LambdaExp and also when it is a ReferenceExp whose value is (known to be) a Procedure. -- Jamison Hope The PTR Group www.theptrgroup.com --Apple-Mail=_C1E10345-9DF8-4AAC-808F-A080178CE909 Content-Disposition: attachment; filename=apply-with-values-single-arg.patch Content-Type: application/octet-stream; name="apply-with-values-single-arg.patch" Content-Transfer-Encoding: 7bit Content-length: 2809 Index: gnu/kawa/functions/ChangeLog =================================================================== --- gnu/kawa/functions/ChangeLog (revision 8374) +++ gnu/kawa/functions/ChangeLog (working copy) @@ -1,3 +1,8 @@ +2015-03-25 Jamison Hope + + * CompileValues.java (validateApplyWithValues): Optimize case + consumer is single-argument procedure. + 2015-03-22 Per Bothner * CompilationHelpers.java (validateSetter): Optimize case when Index: gnu/kawa/functions/CompileValues.java =================================================================== --- gnu/kawa/functions/CompileValues.java (revision 8374) +++ gnu/kawa/functions/CompileValues.java (working copy) @@ -33,6 +33,7 @@ Expression producer = args[0]; Expression consumer = args[1]; Type prequired = null; + boolean singleArgConsumer = false; if (consumer instanceof LambdaExp) { LambdaExp lconsumer = (LambdaExp) consumer; if (lconsumer.min_args == lconsumer.max_args) { @@ -48,9 +49,35 @@ types[i++] = type; } prequired = MultValuesType.create(types); + singleArgConsumer = (lconsumer.min_args == 1); } + } else if (consumer instanceof ReferenceExp) { + Object rconsumer = ((ReferenceExp)consumer).valueIfConstant(); + if (rconsumer instanceof Procedure) { + Procedure pconsumer = (Procedure) rconsumer; + if (pconsumer.minArgs() == pconsumer.maxArgs()) { + Type[] types = new Type[pconsumer.minArgs()]; + if (pconsumer instanceof MethodProc) { + MethodProc mpconsumer = (MethodProc) pconsumer; + for (int i = 0; i < types.length; ++i) { + types[i] = mpconsumer.getParameterType(i); + } + } else { + for (int i = 0; i < types.length; ++i) { + types[i] = Type.objectType; + } + } + prequired = MultValuesType.create(types); + singleArgConsumer = (pconsumer.minArgs() == 1); + } + } } producer = visitor.visit(producer, prequired); + if (singleArgConsumer) { + ApplyExp ae = new ApplyExp(consumer, producer); + ae.setLine(exp); + return visitor.visit(ae, required); + } if (prequired == null) prequired = producer.getType(); --Apple-Mail=_C1E10345-9DF8-4AAC-808F-A080178CE909--