From patchwork Sun Nov 16 03:59:52 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Wohlferd X-Patchwork-Id: 411256 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 09DC61400DE for ; Sun, 16 Nov 2014 15:04:37 +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 :message-id:date:from:mime-version:to:cc:subject:references :in-reply-to:content-type; q=dns; s=default; b=vsgC7/cCNaWwDOCW7 /y3hhWL+9N+jH+t4maNh9R37NZ5yalZbBXTKyKrSnNnJURXF6lod9uEdHR1pvFdx yXsSW69jItwiWJgMiDmwPBKSWoDk/3imJBkRJs57wSA94Gq6KPd3z2jUaMsqnrl5 sACMmM8KTkKVWAt1K5wGgZMrAg= 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 :message-id:date:from:mime-version:to:cc:subject:references :in-reply-to:content-type; s=default; bh=om7LfqOijf6CU1uNMlgG6FL zoSg=; b=Bp2iBq+VAGaCzW85zLzBzGeqKSSz+MSnB+pUmNEguM///UZjEXjlj4g +d5tahyry+pdrU99edFuVpubPXaps3sM4EEtQltQFXZb15kTB4S522OaWF+C9NVO nyuocD1jyV+ZvDnW9xCDMaxHw/alepWg/hYNbDgtsBVtJRKrbyoU= Received: (qmail 7135 invoked by alias); 16 Nov 2014 04:04:29 -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 7119 invoked by uid 89); 16 Nov 2014 04:04:26 -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, SPF_HELO_PASS, SPF_PASS, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: limegreensocks.com Received: from limegreensocks.com (HELO limegreensocks.com) (207.118.20.56) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (DES-CBC3-SHA encrypted) ESMTPS; Sun, 16 Nov 2014 04:04:23 +0000 Received: from [192.168.1.44] ([192.168.1.44]) by limegreensocks.com via TCP with ESMTPSA; Sat, 15 Nov 2014 19:59:52 -0800 Message-ID: <54682138.70008@LimeGreenSocks.com> Date: Sat, 15 Nov 2014 19:59:52 -0800 From: David Wohlferd User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 MIME-Version: 1.0 To: law@redhat.com CC: gcc-patches@gcc.gnu.org Subject: Re: [Patch] PR 61692 - Fix for inline asm ICE References: <53D4A9A2.2050402@LimeGreenSocks.com> <53D6A79E.8060300@redhat.com> <53D6D107.3030404@LimeGreenSocks.com> <53D9CCE4.8010305@redhat.com> <53DB4AB5.4010709@LimeGreenSocks.com> <53DBDC86.7060809@redhat.com> <54154E0D.30806@LimeGreenSocks.com> <54175F6A.70609@redhat.com> In-Reply-To: <54175F6A.70609@redhat.com> X-IsSubscribed: yes On 9/15/2014 2:51 PM, Jeff Law wrote: > Let's go with your original inputs + outputs + labels change and punt > the clobbers stuff for now. > > jeff I have also added the test code you requested. I have a release on file with the FSF, but don't have SVN write access. Problem: extract_insn() in recog.c will ICE if (noperands > MAX_RECOG_OPERANDS). Normally this isn't a problem since expand_asm_operands() in cfgexpand.c catches and reports a proper error for this condition. However, expand_asm_operands() only checks (ninputs + noutputs) instead of (ninputs + noutputs + nlabels), so you can get the ICE when using "asm goto." ChangeLog: 2014-11-15 David Wohlferd PR target/61692 * cfgexpand.c (expand_asm_operands): Count all inline asm params. * testsuite/gcc.dg/pr61692.c: New test. dw Index: gcc/cfgexpand.c =================================================================== --- gcc/cfgexpand.c (revision 217623) +++ gcc/cfgexpand.c (working copy) @@ -2589,7 +2589,7 @@ } ninputs += ninout; - if (ninputs + noutputs > MAX_RECOG_OPERANDS) + if (ninputs + noutputs + nlabels > MAX_RECOG_OPERANDS) { error ("more than %d operands in %", MAX_RECOG_OPERANDS); return; Index: gcc/testsuite/gcc.dg/pr61692.c =================================================================== --- gcc/testsuite/gcc.dg/pr61692.c (revision 0) +++ gcc/testsuite/gcc.dg/pr61692.c (working copy) @@ -0,0 +1,173 @@ +/* PR 61692 */ + +/* Check for ice when exceededing the max # + of parameters to inline asm. */ + +int Labels() +{ + label01: label02: label03: label04: label05: + label06: label07: label08: label09: label10: + label11: label12: label13: label14: label15: + label16: label17: label18: label19: label20: + label21: label22: label23: label24: label25: + label26: label27: label28: label29: label30: + label31: + + __asm__ goto ("" /* Works. */ + : /* no outputs */ + : /* no inputs */ + : /* no clobbers */ + : label01, label02, label03, label04, label05, + label06, label07, label08, label09, label10, + label11, label12, label13, label14, label15, + label16, label17, label18, label19, label20, + label21, label22, label23, label24, label25, + label26, label27, label28, label29, label30); + + __asm__ goto ("" /* { dg-error "more than 30 operands" } */ + : /* no outputs */ + : /* no inputs */ + : /* no clobbers */ + : label01, label02, label03, label04, label05, + label06, label07, label08, label09, label10, + label11, label12, label13, label14, label15, + label16, label17, label18, label19, label20, + label21, label22, label23, label24, label25, + label26, label27, label28, label29, label30, + label31); + + return 0; +} + +int Labels_and_Inputs() +{ + int b01, b02, b03, b04, b05, b06, b07, b08, b09, b10; + int b11, b12, b13, b14, b15, b16, b17, b18, b19, b20; + int b21, b22, b23, b24, b25, b26, b27, b28, b29, b30; + int b31; + + label01: label02: label03: label04: label05: + label06: label07: label08: label09: label10: + label11: label12: label13: label14: label15: + label16: label17: label18: label19: label20: + label21: label22: label23: label24: label25: + label26: label27: label28: label29: label30: + label31: + + b01 = b02 = b03 = b04 = b05 = b06 = b07 = b08 = b09 = b10 = 0; + b11 = b12 = b13 = b14 = b15 = b16 = b17 = b18 = b19 = b20 = 0; + b21 = b22 = b23 = b24 = b25 = b26 = b27 = b28 = b29 = b30 = 0; + b31 = 0; + + __asm__ goto ("" /* Works. */ + : /* no outputs */ + : "m" (b01), "m" (b02), "m" (b03), "m" (b04), "m" (b05), + "m" (b06), "m" (b07), "m" (b08), "m" (b09), "m" (b10), + "m" (b11), "m" (b12), "m" (b13), "m" (b14), "m" (b15), + "m" (b16), "m" (b17), "m" (b18), "m" (b19), "m" (b20), + "m" (b21), "m" (b22), "m" (b23), "m" (b24), "m" (b25), + "m" (b26), "m" (b27), "m" (b28), "m" (b29) + : /* no clobbers */ + : label01); + + __asm__ goto ("" /* { dg-error "more than 30 operands" } */ + : /* no outputs */ + : "m" (b01), "m" (b02), "m" (b03), "m" (b04), "m" (b05), + "m" (b06), "m" (b07), "m" (b08), "m" (b09), "m" (b10), + "m" (b11), "m" (b12), "m" (b13), "m" (b14), "m" (b15), + "m" (b16), "m" (b17), "m" (b18), "m" (b19), "m" (b20), + "m" (b21), "m" (b22), "m" (b23), "m" (b24), "m" (b25), + "m" (b26), "m" (b27), "m" (b28), "m" (b29), "m" (b30) + : /* no clobbers */ + : label01); + + return 0; +} + +int Outputs() +{ + int b01, b02, b03, b04, b05, b06, b07, b08, b09, b10; + int b11, b12, b13, b14, b15, b16, b17, b18, b19, b20; + int b21, b22, b23, b24, b25, b26, b27, b28, b29, b30; + int b31; + + /* Outputs. */ + __asm__ volatile ("" /* Works. */ + : "=m" (b01), "=m" (b02), "=m" (b03), "=m" (b04), "=m" (b05), + "=m" (b06), "=m" (b07), "=m" (b08), "=m" (b09), "=m" (b10), + "=m" (b11), "=m" (b12), "=m" (b13), "=m" (b14), "=m" (b15), + "=m" (b16), "=m" (b17), "=m" (b18), "=m" (b19), "=m" (b20), + "=m" (b21), "=m" (b22), "=m" (b23), "=m" (b24), "=m" (b25), + "=m" (b26), "=m" (b27), "=m" (b28), "=m" (b29), "=m" (b30)); + + __asm__ volatile ("" /* { dg-error "more than 30 operands" } */ + : "=m" (b01), "=m" (b02), "=m" (b03), "=m" (b04), "=m" (b05), + "=m" (b06), "=m" (b07), "=m" (b08), "=m" (b09), "=m" (b10), + "=m" (b11), "=m" (b12), "=m" (b13), "=m" (b14), "=m" (b15), + "=m" (b16), "=m" (b17), "=m" (b18), "=m" (b19), "=m" (b20), + "=m" (b21), "=m" (b22), "=m" (b23), "=m" (b24), "=m" (b25), + "=m" (b26), "=m" (b27), "=m" (b28), "=m" (b29), "=m" (b30), + "=m" (b31)); + + return 0; +} + +int Inputs() +{ + int b01, b02, b03, b04, b05, b06, b07, b08, b09, b10; + int b11, b12, b13, b14, b15, b16, b17, b18, b19, b20; + int b21, b22, b23, b24, b25, b26, b27, b28, b29, b30; + int b31; + + b01 = b02 = b03 = b04 = b05 = b06 = b07 = b08 = b09 = b10 = 0; + b11 = b12 = b13 = b14 = b15 = b16 = b17 = b18 = b19 = b20 = 0; + b21 = b22 = b23 = b24 = b25 = b26 = b27 = b28 = b29 = b30 = 0; + b31 = 0; + + __asm__ volatile ("" /* Works. */ + : /* no outputs */ + : "m" (b01), "m" (b02), "m" (b03), "m" (b04), "m" (b05), + "m" (b06), "m" (b07), "m" (b08), "m" (b09), "m" (b10), + "m" (b11), "m" (b12), "m" (b13), "m" (b14), "m" (b15), + "m" (b16), "m" (b17), "m" (b18), "m" (b19), "m" (b20), + "m" (b21), "m" (b22), "m" (b23), "m" (b24), "m" (b25), + "m" (b26), "m" (b27), "m" (b28), "m" (b29), "m" (b30)); + + __asm__ volatile ("" /* { dg-error "more than 30 operands" } */ + : /* no outputs */ + : "m" (b01), "m" (b02), "m" (b03), "m" (b04), "m" (b05), + "m" (b06), "m" (b07), "m" (b08), "m" (b09), "m" (b10), + "m" (b11), "m" (b12), "m" (b13), "m" (b14), "m" (b15), + "m" (b16), "m" (b17), "m" (b18), "m" (b19), "m" (b20), + "m" (b21), "m" (b22), "m" (b23), "m" (b24), "m" (b25), + "m" (b26), "m" (b27), "m" (b28), "m" (b29), "m" (b30), + "m" (b31)); + + return 0; +} + +int Input_Output() +{ + int b01, b02, b03, b04, b05, b06, b07, b08, b09, b10; + int b11, b12, b13, b14, b15, b16, b17, b18, b19, b20; + int b21, b22, b23, b24, b25, b26, b27, b28, b29, b30; + int b31; + + b01 = b02 = b03 = b04 = b05 = b06 = b07 = b08 = b09 = b10 = 0; + b11 = b12 = b13 = b14 = b15 = b16 = b17 = b18 = b19 = b20 = 0; + b21 = b22 = b23 = b24 = b25 = b26 = b27 = b28 = b29 = b30 = 0; + b31 = 0; + + __asm__ volatile ("" /* Works. */ + : "+m" (b01), "+m" (b02), "+m" (b03), "+m" (b04), "+m" (b05), + "+m" (b06), "+m" (b07), "+m" (b08), "+m" (b09), "+m" (b10), + "+m" (b11), "+m" (b12), "+m" (b13), "+m" (b14), "+m" (b15)); + + __asm__ volatile ("" /* { dg-error "more than 30 operands" } */ + : "+m" (b01), "+m" (b02), "+m" (b03), "+m" (b04), "+m" (b05), + "+m" (b06), "+m" (b07), "+m" (b08), "+m" (b09), "+m" (b10), + "+m" (b11), "+m" (b12), "+m" (b13), "+m" (b14), "+m" (b15), + "+m" (b16)); + + return 0; +}