From patchwork Wed Oct 11 19:39:21 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Makarov X-Patchwork-Id: 824528 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-463974-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="pBm7ZTpi"; dkim-atps=neutral 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 3yC47J3jl2z9t2V for ; Thu, 12 Oct 2017 06:39:39 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :subject:to:message-id:date:mime-version:content-type; q=dns; s= default; b=qrhnUmigW1Yt3hh7O9C4gllnmITVz9IApEGWJTMF1K1ZfGALTtscF cZvqTdDuh+3D8IAqVNNow4QaS5K0+WkaLyinq4TdoSlzwhfWHnbEoDILF2Oe4ELU x4la4tLZrtarQFmqanKqdhlBx1EU3EIUozhuiOAExKXXcX4hDs8QmY= 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:from :subject:to:message-id:date:mime-version:content-type; s= default; bh=YlcCafpjGTWs/WsOXhljYr5Sb5M=; b=pBm7ZTpiEzOCxeJnGNTp tyu4Ldz3HIznz6fM0I86iCLds1E8d1rc7+YziSYLs6jQVMwLqJc9qhzt3TqSkLnn TITttba0FG+zKQA1lXOT8S+zZQ/M+BysHkWoRpQvBwOir5E+4ZepbNNufWnDKotO HvLeGV6j/86LWv716hK5Wnc= Received: (qmail 49189 invoked by alias); 11 Oct 2017 19:39:27 -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 49177 invoked by uid 89); 11 Oct 2017 19:39:25 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-10.1 required=5.0 tests=BAYES_00, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, KAM_LAZY_DOMAIN_SECURITY, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=Hx-languages-length:6297, su, 2999, ebb X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 11 Oct 2017 19:39:23 +0000 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4C9214A6F0 for ; Wed, 11 Oct 2017 19:39:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 4C9214A6F0 Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=vmakarov@redhat.com Received: from topor.usersys.redhat.com (unused-10-15-17-214.yyz.redhat.com [10.15.17.214]) by smtp.corp.redhat.com (Postfix) with ESMTP id 11DDA4C3 for ; Wed, 11 Oct 2017 19:39:21 +0000 (UTC) From: Vladimir Makarov Subject: patch to fix PR82353 To: gcc-patches Message-ID: Date: Wed, 11 Oct 2017 15:39:21 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.1.0 MIME-Version: 1.0 X-IsSubscribed: yes The following patch fixes https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82353 LRA did not update hard reg liveness on bb borders for hard regs which are part of insn patterns like CFLAGS reg. It was ok for inheritance in EBB which creates only moves and they usually have no embedded hard regs in the patterns. But LRA rematerialization needs this. So this patch implements such hard reg liveness updates. The patch was successfully bootstrapped and tested on x86-64. Committed as rev. 253656. Index: ChangeLog =================================================================== --- ChangeLog (revision 253655) +++ ChangeLog (working copy) @@ -1,3 +1,12 @@ +2017-10-11 Vladimir Makarov + + PR sanitizer/82353 + * lra.c (collect_non_operand_hard_regs): Don't ignore operator + locations. + * lra-lives.c (bb_killed_pseudos, bb_gen_pseudos): Move up. + (make_hard_regno_born, make_hard_regno_dead): Update + bb_killed_pseudos and bb_gen_pseudos. + 2017-10-11 Nathan Sidwell * incpath.h (enum incpath_kind): Name enum, prefix values. Index: testsuite/ChangeLog =================================================================== --- testsuite/ChangeLog (revision 253655) +++ testsuite/ChangeLog (working copy) @@ -1,3 +1,9 @@ +2017-10-11 Vladimir Makarov + + PR sanitizer/82353 + * gcc.target/i386/i386.exp (tests): Permit '.C' extension. + * gcc.target/i386/pr82353.C: New. + 2017-10-11 Uros Bizjak * gcc.target/i386/387-ficom-1.c: New test. Index: lra-lives.c =================================================================== --- lra-lives.c (revision 253253) +++ lra-lives.c (working copy) @@ -220,6 +220,9 @@ lra_intersected_live_ranges_p (lra_live_ return false; } +/* The corresponding bitmaps of BB currently being processed. */ +static bitmap bb_killed_pseudos, bb_gen_pseudos; + /* The function processing birth of hard register REGNO. It updates living hard regs, START_LIVING, and conflict hard regs for living pseudos. Conflict hard regs for the pic pseudo is not updated if @@ -243,6 +246,7 @@ make_hard_regno_born (int regno, bool ch || i != REGNO (pic_offset_table_rtx)) #endif SET_HARD_REG_BIT (lra_reg_info[i].conflict_hard_regs, regno); + bitmap_set_bit (bb_gen_pseudos, regno); } /* Process the death of hard register REGNO. This updates @@ -255,6 +259,8 @@ make_hard_regno_dead (int regno) return; sparseset_set_bit (start_dying, regno); CLEAR_HARD_REG_BIT (hard_regs_live, regno); + bitmap_clear_bit (bb_gen_pseudos, regno); + bitmap_set_bit (bb_killed_pseudos, regno); } /* Mark pseudo REGNO as living at program point POINT, update conflicting @@ -299,9 +305,6 @@ mark_pseudo_dead (int regno, int point) } } -/* The corresponding bitmaps of BB currently being processed. */ -static bitmap bb_killed_pseudos, bb_gen_pseudos; - /* Mark register REGNO (pseudo or hard register) in MODE as live at program point POINT. Update BB_GEN_PSEUDOS. Return TRUE if the liveness tracking sets were modified, or FALSE Index: lra.c =================================================================== --- lra.c (revision 253253) +++ lra.c (working copy) @@ -820,7 +820,8 @@ collect_non_operand_hard_regs (rtx *x, l const char *fmt = GET_RTX_FORMAT (code); for (i = 0; i < data->insn_static_data->n_operands; i++) - if (x == data->operand_loc[i]) + if (! data->insn_static_data->operand[i].is_operator + && x == data->operand_loc[i]) /* It is an operand loc. Stop here. */ return list; for (i = 0; i < data->insn_static_data->n_dups; i++) Index: testsuite/gcc.target/i386/i386.exp =================================================================== --- testsuite/gcc.target/i386/i386.exp (revision 253253) +++ testsuite/gcc.target/i386/i386.exp (working copy) @@ -445,7 +445,7 @@ if [runtest_file_p $runtests $srcdir/$su } # Everything else. -set tests [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] +set tests [lsort [glob -nocomplain $srcdir/$subdir/*.\[cCS\]]] set tests [prune $tests $srcdir/$subdir/vect-args.c] # Main loop. Index: testsuite/gcc.target/i386/pr82353.C =================================================================== --- testsuite/gcc.target/i386/pr82353.C (nonexistent) +++ testsuite/gcc.target/i386/pr82353.C (working copy) @@ -0,0 +1,60 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -std=c++11 -fsanitize=undefined -fno-sanitize-recover=undefined -w -fdump-rtl-reload" } */ + +extern unsigned long tf_2_var_1, tf_2_var_21; +extern bool tf_2_var_2, tf_2_var_24, tf_2_var_6, tf_2_var_5; +extern unsigned char tf_2_var_16, tf_2_var_31; +extern short tf_2_var_69; +extern unsigned tf_2_var_233; +struct tf_2_struct_1 { + short member_1_0 : 27; + long member_1_1 : 10; +}; +struct a { + int member_2_0 : 5; +}; +struct tf_2_struct_3 { + static tf_2_struct_1 member_3_0; +}; +struct tf_2_struct_4 { + static unsigned member_4_0; + a member_4_1; +}; +struct tf_2_struct_5 { + tf_2_struct_1 member_5_2; + tf_2_struct_4 member_5_4; +}; +struct tf_2_struct_6 { + tf_2_struct_5 member_6_2; + short member_6_4; +} extern tf_2_struct_obj_2; +extern tf_2_struct_3 tf_2_struct_obj_8; +tf_2_struct_1 a; +tf_2_struct_5 b; +tf_2_struct_1 tf_2_struct_3::member_3_0; +unsigned tf_2_struct_4::member_4_0; +void tf_2_init() { + a.member_1_1 = tf_2_struct_obj_2.member_6_2.member_5_2.member_1_1 = 5; +} +void tf_2_foo() { + int c = tf_2_struct_obj_2.member_6_2.member_5_4.member_4_1.member_2_0 - + -~tf_2_struct_obj_2.member_6_4 * char(90284000534361); + tf_2_struct_obj_8.member_3_0.member_1_0 = + tf_2_var_24 > + tf_2_var_21 * a.member_1_0 * tf_2_var_2 - tf_2_var_5 % a.member_1_1; + if ((~(tf_2_var_31 * tf_2_var_6) && + -~tf_2_struct_obj_2.member_6_4 * 90284000534361) % + ~tf_2_var_31 * tf_2_var_6) + b.member_5_2.member_1_0 << tf_2_var_16 << tf_2_var_1; + tf_2_var_233 = -~tf_2_struct_obj_2.member_6_4 * char(90284000534361); + int d(tf_2_struct_obj_2.member_6_4); + if (b.member_5_2.member_1_0) + b.member_5_2.member_1_1 = c; + bool e(~-~tf_2_struct_obj_2.member_6_4); + a.member_1_1 % e; + if (tf_2_var_5 / tf_2_struct_obj_2.member_6_2.member_5_2.member_1_1) + b.member_5_4.member_4_0 = tf_2_var_21 * a.member_1_0 * tf_2_var_2; + tf_2_var_69 = tf_2_var_6; +} + +/* { dg-final { scan-rtl-dump-not "Inserting rematerialization insn" "reload" } } */