From patchwork Wed May 6 23:00:00 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Lance Taylor X-Patchwork-Id: 469169 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3AFCB140283 for ; Thu, 7 May 2015 09:00:14 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=Ql0C+Nty; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:date:message-id:subject:from:to:content-type; q= dns; s=default; b=EWQBF7oIXoqKQ4/lotuOZ+L6KaMH1jsqPZzetDQ0mVbHiF s7T0ZclFmNxd/rJoKu+slM56QL+lp2Kd3aNqHYwVCtuRx75eY45Hr5GCgvBnYSED e3GEFjlJjtAP8QT0U6OFgCRPsSADUtOujCganOpZTlEn3WEYrpEp0WL1tWUbY= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:date:message-id:subject:from:to:content-type; s= default; bh=+HpL31hK8y0lvQYJqkiuFDhSyCc=; b=Ql0C+NtyhM5Y3QuUOCA/ n1Zw3ySkO6PFsDv418vSAw2u72sb6/az6yjrFMHP7ugNgOR7cFHFukHePCwdQwLD FlbsZUPYe0lxXYKHfH0oPEnSUW68SrPWT2Sm2azBte8U+qMpQkSLAqbhfioqnaZQ XIi88t6UK/H6B/XRGJoLwfA= Received: (qmail 8943 invoked by alias); 6 May 2015 23:00:06 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 8919 invoked by uid 89); 6 May 2015 23:00:04 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-qk0-f172.google.com Received: from mail-qk0-f172.google.com (HELO mail-qk0-f172.google.com) (209.85.220.172) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Wed, 06 May 2015 23:00:03 +0000 Received: by qku63 with SMTP id 63so16897288qku.3 for ; Wed, 06 May 2015 16:00:00 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to :content-type; bh=3gVUncIRy7/SoUtWNBvIY8Se4G6biQ8ffXkkvfooPUs=; b=VWcDyVeeY3PiqcufeJlEz3md/RdzuIWu2wj5mycPxlF1bIiNHprgP3gfFAMrextUeh RicneIfmDHO69LrV8VKadTNytk5illOyMOxBSATO5m80tAxiWDbbgkASMzSoDtNbzguI FGauCaGvf2Fyep66/VxhrPM3HSy5MRNrR+CjtbQyZgNYgsB/sNQI1lpGp33DrBXB6SKL sddSFO66QzXnWIqknpf0zR1CMQamHj+5HRxzOjTG43brVSEBAR0fjPpar0Km37pN4t1H OJIVPlk4XngbZwrIAVcIcGA0gk8AtDz1f1kQpNP1dFFEGrjVEL0BOi70GctbzdlLaIB+ YBgA== X-Gm-Message-State: ALoCoQmDkdNrJbi8BkT+G/5Z97JpJMmkQcwKltf2RLSHEyek381wrkZ/YFgl9NcayzSMhqQStNz7 MIME-Version: 1.0 X-Received: by 10.140.19.111 with SMTP id 102mr1426356qgg.83.1430953200535; Wed, 06 May 2015 16:00:00 -0700 (PDT) Received: by 10.96.150.99 with HTTP; Wed, 6 May 2015 16:00:00 -0700 (PDT) Date: Wed, 6 May 2015 16:00:00 -0700 Message-ID: Subject: Go patch committed: Better escape analysis for interface parameters From: Ian Lance Taylor To: gcc-patches , "gofrontend-dev@googlegroups.com" This patch from Chris Manghane improves escape analysis for interface parameters. Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline. Ian diff -r aaa6df965e1f go/escape.cc --- a/go/escape.cc Tue May 05 13:56:24 2015 -0700 +++ b/go/escape.cc Wed May 06 15:58:51 2015 -0700 @@ -586,8 +586,20 @@ // Only call expression statements are interesting // e.g. 'func(var)' for which we can show var does not escape. Call_expression* ce = e->call_expression(); - if (ce == NULL || ce->args() == NULL) + if (ce == NULL) return; + else if (ce->args() == NULL) + { + if (ce->fn()->interface_field_reference_expression() != NULL) + { + // This is a call to an interface method with no arguments. OBJECT + // must be the receiver and we assume it escapes. + Connection_node* rcvr_node = + this->gogo_->add_connection_node(object)->connection_node(); + rcvr_node->set_escape_state(Node::ESCAPE_ARG); + } + return; + } // If the function call that references OBJECT is unknown, we must be // conservative and assume every argument escapes. A function call is unknown @@ -606,6 +618,8 @@ this->gogo_->add_connection_node(arg_no)->connection_node(); arg_node->set_escape_state(Node::ESCAPE_ARG); } + else if ((*arg)->call_expression() != NULL) + this->handle_call(object, *arg); } return; } @@ -787,7 +801,6 @@ ++pos) { std::string param_name; - bool param_is_interface = false; if (*pos >= 0 && params->size() <= static_cast(*pos)) { // There were more arguments than there are parameters. This must be @@ -804,11 +817,7 @@ param_name = fntype->receiver()->name(); } else - { - param_name = params->at(*pos).name(); - param_is_interface = - (params->at(*pos).type()->interface_type() != NULL); - } + param_name = params->at(*pos).name(); if (Gogo::is_sink_name(param_name) || param_name.empty()) continue; @@ -832,11 +841,6 @@ Node* arg_node = this->gogo_->add_connection_node(object); Node* param_node = this->gogo_->add_connection_node(param_no); - - // Act conservatively when an argument is converted into an interface - // value. FIXME. - if (param_is_interface) - param_node->connection_node()->set_escape_state(Node::ESCAPE_ARG); param_node->add_edge(arg_node); }