From patchwork Tue Feb 11 07:48:11 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wei Mi X-Patchwork-Id: 319164 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 2BD152C00B8 for ; Tue, 11 Feb 2014 18:48:23 +1100 (EST) 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:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; q=dns; s=default; b=whB8aL71BfgBW/h7qk ZI4wOThhegcSYd471eHp9sK8xorR4DJ02r/X/ZT673KCyrtIR8SSh1vcovHnyWYL +naqOIxqoW3yjtRnBsLKp1okmcyo5a90Tgtn+z36c/eAG/XR+zNJWKRZjDWwIQcI gYTYbrpIN1g4KpqCJWSyfJwNY= 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:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; s=default; bh=LWAEKn8FBiRgm+277Z3umLYH Wrg=; b=cxa9PIYm/lbndwmO+iZZR+gC7yCtO8mS/B7krw4JLO4wHmUOWPqOPqVW YfoZzwWll4dHRnY5mBKh9g55Ii1JbU1ws4qp5yhiMuVaNL16Wg2YC3GT9XuWBF+p re1er/hEzwUmK0p0RtzaHHK605xMf35lbVqxDzJhYfWomv8xTkc= Received: (qmail 21436 invoked by alias); 11 Feb 2014 07:48:15 -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 21425 invoked by uid 89); 11 Feb 2014 07:48:14 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.1 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-oa0-f44.google.com Received: from mail-oa0-f44.google.com (HELO mail-oa0-f44.google.com) (209.85.219.44) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Tue, 11 Feb 2014 07:48:13 +0000 Received: by mail-oa0-f44.google.com with SMTP id g12so8772226oah.3 for ; Mon, 10 Feb 2014 23:48:11 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=ccjjrWKxGZOqqEt1orsYwHv/ZOYevkSZGM42OTLHsNM=; b=iOZcCIeMBepXG1Q/Q8Kv5l/OIGJI9vB8Zb5Zh3qhLtAKR9y1zICvze2EHU82T9du+z Wo5YGCkEcLVWFsAtC+ushkZJ3BY3v4RipxCd9xqInXwQZERBZems9zghQaUCh+lBcTCo SZ1JII78plO9oeDRu/tiJ6mhtmXUwE6dTQosJi3AdtnHwvUmHiLB2VsD5RmyzMRIvNUI /rV9q1H3OGLe1QJiIbh/1MfnkEtJQvAzfYlSL81bHJ7e5abo5X4kolnKNHv5hduOu9fn 2cWfhl342atlMFh2wVwl+BdW+9JK84esz34SJUrq3J5ezpCuNjMKmn2+eh4HSm0S9Qla 9g4g== X-Gm-Message-State: ALoCoQlFWVMTmr7/wmAUbnLvuM/d2NIQ73YTyiKFAn8GVletyRzL5PtSzu9CHFvDpbzYwOAIkbuMm+0lRF0f14HxQtTpZZc1EdUTU29SISYo4avGc+Q46xFuvv5MaIucp4vLGJ3gYkDVRW+5a0KSGcLNu5+HXI5vUNGTUnpVAS7nWJunpE9oR/8DPvco8w++RFLTO2HcazAx2bbCO/qZgYF9kk3cBwb60Q== MIME-Version: 1.0 X-Received: by 10.182.88.69 with SMTP id be5mr211709obb.55.1392104891301; Mon, 10 Feb 2014 23:48:11 -0800 (PST) Received: by 10.76.180.193 with HTTP; Mon, 10 Feb 2014 23:48:11 -0800 (PST) In-Reply-To: References: Date: Mon, 10 Feb 2014 23:48:11 -0800 Message-ID: Subject: Re: [google gcc-4_8] Don't use gcov counter related ssa name as induction variables From: Wei Mi To: Xinliang David Li Cc: GCC Patches , Rong Xu , Easwaran Raman Here is the updated patch, which follow UD chain to determine whether iv.base is defined by __gcovx.xxx[] var. It is a lot simpler than adding a tree bit. regression test and previously failed benchmark in piii mode is ok. Other test is going on. 2014-02-10 Wei Mi * tree-ssa-loop-ivopts.c (defined_by_gcov_counter): New. (contains_abnormal_ssa_name_p): Add defined_by_gcov_counter check for ssa name. * testsuite/gcc.dg/profile-generate-4.c: New. +/* { dg-final { cleanup-tree-dump "ivopts" } } */ Index: tree-ssa-loop-ivopts.c =================================================================== --- tree-ssa-loop-ivopts.c (revision 207019) +++ tree-ssa-loop-ivopts.c (working copy) @@ -705,6 +705,68 @@ idx_contains_abnormal_ssa_name_p (tree b return !abnormal_ssa_name_p (*index); } +/* Return true if the use is defined by a gcov counter var. + It is used to check if an iv candidate is generated for + profiling. For profile generated ssa name, we should not + use it as IV because gcov counter may have data-race for + multithread program, it could involve tricky bug to use + such ssa var in IVOPT. + + To limit patterns to be checked, we list the possible cases + here: + Before PRE, the ssa name used to set __gcov counter is as + follows: + for () { + PROF_edge_counter_1 = __gcov.foo[i]; + PROF_edge_counter_2 = PROF_edge_counter_1 + 1; + __gcov.foo[i] = PROF_edge_counter_2; + } + If PRE works, the loop may be transformed to: + pretmp_1 = __gcov.foo[i]; + for () { + prephitmp_1 = PHI (PROF_edge_counter_2, pretmp_1); + PROF_edge_counter_1 = prephitmp_1; + PROF_edge_counter_2 = PROF_edge_counter_1 + 1; + __gcov.foo[i] = PROF_edge_counter_2; + } + So there are two cases: + case1: If PRE doesn't work, PROF_edge_counter_1 and PROF_edge_counter_2 + are neither induction variables candidates. We don't have to worry + about this case. + case2: If PRE works, the iv candidate base of PROF_edge_counter_1 and + PROF_edge_counter_2 are pretmp_1 or pretmp_1 + 1. pretmp_1 is defined + by __gcov var. + + So this func only has to check case2. For a ssa name which is an iv + candidate, check its base USE and see if it is defined by __gcov var. + Returning true means the ssa name is generated for profiling. */ + +bool +defined_by_gcov_counter (tree use) +{ + gimple stmt; + tree rhs, decl; + const char *name; + + stmt = SSA_NAME_DEF_STMT (use); + if (!is_gimple_assign (stmt)) + return false; + + rhs = gimple_assign_rhs1 (stmt); + if (TREE_CODE (rhs) != ARRAY_REF) + return false; + + decl = TREE_OPERAND (rhs, 0); + if (TREE_CODE (decl) != VAR_DECL) + return false; + + name = IDENTIFIER_POINTER (DECL_NAME (decl)); + if (strncmp (name, "__gcov", 6)) + return false; + + return true; +} + /* Returns true if EXPR contains a ssa name that occurs in an abnormal phi node. */ @@ -721,7 +783,8 @@ contains_abnormal_ssa_name_p (tree expr) codeclass = TREE_CODE_CLASS (code); if (code == SSA_NAME) - return SSA_NAME_OCCURS_IN_ABNORMAL_PHI (expr) != 0; + return SSA_NAME_OCCURS_IN_ABNORMAL_PHI (expr) != 0 + || defined_by_gcov_counter (expr); if (code == INTEGER_CST || is_gimple_min_invariant (expr)) Index: testsuite/gcc.dg/profile-generate-4.c =================================================================== --- testsuite/gcc.dg/profile-generate-4.c (revision 0) +++ testsuite/gcc.dg/profile-generate-4.c (revision 0) @@ -0,0 +1,21 @@ +/* { dg-do compile { target { i?86-*-* x86_64-*-* } } } */ +/* { dg-options "-O2 -fprofile-generate -fno-tree-loop-im -fdump-tree-ivopts-details-blocks" } */ + +/* Because gcov counter related var has data race for multithread program, + compiler should prevent them from affecting program correctness. So + PROF_edge_counter variable should not be used as induction variable, or + else IVOPT may use such variable to compute loop boundary. */ + +void *ptr; +int N; + +void foo(void *t) { + int i; + for (i = 0; i < N; i++) { + t = *(void **)t; + } + ptr = t; +} + +/* { dg-final { scan-tree-dump-times "ssa name PROF_edge_counter" 0 "ivopts"} } */