From patchwork Fri Jan 13 15:02:44 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Martin_Li=C5=A1ka?= X-Patchwork-Id: 91439 Delivered-To: patch@linaro.org Received: by 10.182.3.34 with SMTP id 2csp175160obz; Fri, 13 Jan 2017 07:03:20 -0800 (PST) X-Received: by 10.84.218.205 with SMTP id g13mr29855831plm.78.1484319800197; Fri, 13 Jan 2017 07:03:20 -0800 (PST) Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id x1si12944598pgc.275.2017.01.13.07.03.19 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 13 Jan 2017 07:03:20 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-return-446098-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org; spf=pass (google.com: domain of gcc-patches-return-446098-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-446098-patch=linaro.org@gcc.gnu.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:to:cc :from:subject:message-id:date:mime-version:content-type; q=dns; s=default; b=ErPqnBeILY7lPFpteagdfJuDsUb5qqPjsEEUnM2ZdBX/gQ6pnb 2GoGUcO090npaV/fZW7E68h4nSfoGS25Jqj2wNmIMOayyIu1fPcIuhR/lYsWC8+i cZsY0MnK3aIUjtKelTODeKC8NdiSVUbnuZAsCGkZq+YuX+vP1u4PAXGdM= 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:to:cc :from:subject:message-id:date:mime-version:content-type; s= default; bh=5JkuO/Y86hmmwixqlecko/bjiwQ=; b=OJW6yz/LxBSfxq7k+cdh 32UkJkfB4MsZViOKvm1+GL6CTzL0LzrGag9sIZhi+RK7YJJOG4NxRgFYbInUVbqM Lw0CJlMCXGA461fH8mNGJVIvtPQtKEwKVIHn2gQ8FpTgyCuXL8YM/LgXvpOeQEH8 FDuFARms7OzN2lkbi0/CeZI= Received: (qmail 63995 invoked by alias); 13 Jan 2017 15:02:59 -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 63889 invoked by uid 89); 13 Jan 2017 15:02:59 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=BAYES_00, SPF_PASS autolearn=ham version=3.3.2 spammy=TYPE_SIZE, type_size, Hx-languages-length:4039 X-HELO: mx2.suse.de Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 13 Jan 2017 15:02:48 +0000 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 9EBBBABDB; Fri, 13 Jan 2017 15:02:46 +0000 (UTC) To: GCC Patches Cc: Jan Hubicka From: =?UTF-8?Q?Martin_Li=c5=a1ka?= Subject: [PATCH] Fix wrong assumption in contains_type_p (PR ipa/71207). Message-ID: <61727576-2f83-3155-c6dc-655e4770d79e@suse.cz> Date: Fri, 13 Jan 2017 16:02:44 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.5.1 MIME-Version: 1.0 X-IsSubscribed: yes Hello. As mentioned in the PR, having a diamond virtual inheritance can cause a wrong assumption done in contains_type_p. I also decided to rename one argument of the function as otr_type and outer_type names are very confusing. Apart from what was written in bugzilla I also verified that after the hunk removal, there's no situation on Firefox where the function would return true, which used to return false. Patch can bootstrap on ppc64le-redhat-linux and survives regression tests. Ready to be installed? Martin >From 47e06bcf33719df390b9c49328235d9cbb48e4a7 Mon Sep 17 00:00:00 2001 From: marxin Date: Thu, 12 Jan 2017 15:55:42 +0100 Subject: [PATCH] Fix wrong assumption in contains_type_p (PR ipa/71207). gcc/testsuite/ChangeLog: 2017-01-12 Martin Liska PR ipa/71207 * g++.dg/ipa/pr71207.C: New test. gcc/ChangeLog: 2017-01-12 Martin Liska PR ipa/71207 * ipa-polymorphic-call.c (contains_type_p): Fix wrong assumption, add comment and renamed otr_type to inner_type. --- gcc/ipa-polymorphic-call.c | 22 ++++++++++---------- gcc/testsuite/g++.dg/ipa/pr71207.C | 42 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ipa/pr71207.C diff --git a/gcc/ipa-polymorphic-call.c b/gcc/ipa-polymorphic-call.c index da64ce4c6e0..c13fc858c86 100644 --- a/gcc/ipa-polymorphic-call.c +++ b/gcc/ipa-polymorphic-call.c @@ -446,15 +446,15 @@ no_useful_type_info: } } -/* Return true if OUTER_TYPE contains OTR_TYPE at OFFSET. - CONSIDER_PLACEMENT_NEW makes function to accept cases where OTR_TYPE can +/* Return true if OUTER_TYPE contains INNER_TYPE at OFFSET. + CONSIDER_PLACEMENT_NEW makes function to accept cases where INNER_TYPE can be built within OUTER_TYPE by means of placement new. CONSIDER_BASES makes - function to accept cases where OTR_TYPE appears as base of OUTER_TYPE or as + function to accept cases where INNER_TYPE appears as base of OUTER_TYPE or as base of one of fields of OUTER_TYPE. */ static bool contains_type_p (tree outer_type, HOST_WIDE_INT offset, - tree otr_type, + tree inner_type, bool consider_placement_new, bool consider_bases) { @@ -463,18 +463,18 @@ contains_type_p (tree outer_type, HOST_WIDE_INT offset, /* Check that type is within range. */ if (offset < 0) return false; - if (TYPE_SIZE (outer_type) && TYPE_SIZE (otr_type) - && TREE_CODE (TYPE_SIZE (outer_type)) == INTEGER_CST - && TREE_CODE (TYPE_SIZE (otr_type)) == INTEGER_CST - && wi::ltu_p (wi::to_offset (TYPE_SIZE (outer_type)), - (wi::to_offset (TYPE_SIZE (otr_type)) + offset))) - return false; + + /* PR ipa/71207 + As OUTER_TYPE can be a type which has a diamond virtual inheritance, + it's not necessary that INNER_TYPE will fit within OUTER_TYPE with + a given offset. It can happen that INNER_TYPE also contains a base object, + however it would point to the same instance in the OUTER_TYPE. */ context.offset = offset; context.outer_type = TYPE_MAIN_VARIANT (outer_type); context.maybe_derived_type = false; context.dynamic = false; - return context.restrict_to_inner_class (otr_type, consider_placement_new, + return context.restrict_to_inner_class (inner_type, consider_placement_new, consider_bases); } diff --git a/gcc/testsuite/g++.dg/ipa/pr71207.C b/gcc/testsuite/g++.dg/ipa/pr71207.C new file mode 100644 index 00000000000..19a03998460 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr71207.C @@ -0,0 +1,42 @@ +/* PR ipa/71207 */ +/* { dg-do run } */ + +class Class1 +{ +public: + Class1() {}; + virtual ~Class1() {}; + +protected: + unsigned Field1; +}; + +class Class2 : public virtual Class1 +{ +}; + +class Class3 : public virtual Class1 +{ +public: + virtual void Method1() = 0; + + void Method2() + { + Method1(); + } +}; + +class Class4 : public Class2, public virtual Class3 +{ +public: + Class4() {}; + virtual void Method1() {}; +}; + +int main() +{ + Class4 var1; + var1.Method2(); + + return 0; +} -- 2.11.0