From patchwork Thu Aug 23 16:59:47 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Uros Bizjak X-Patchwork-Id: 179686 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]) by ozlabs.org (Postfix) with SMTP id 5F7572C00BD for ; Fri, 24 Aug 2012 03:00:41 +1000 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1346346042; h=Comment: DomainKey-Signature:Received:Received:Received:Received: MIME-Version:Received:Received:Date:Message-ID:Subject:From:To: Cc:Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:Sender:Delivered-To; bh=cw2Nspf TZz9RbC2cYu0tYXt5WIA=; b=uBPEKfjjD9X/077lU168NnaGtwRZNbyohRxusHQ qONjQn2seeGLRKfsVeXcAwk+RytjmOdwHaH9cEWsrbMMZ20SW4oaz7++Fu6hjIqY 57nKfNaHGWuotcGu3Mu13/3FjuoS3EJA+yuNDtlzNtikP70W8aMlMwqCRGOUWI5N wE8Q= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:MIME-Version:Received:Received:Date:Message-ID:Subject:From:To:Cc:Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=QKyTtlZDNg7PBCt1D8vZT/NKiwdrmKyB39J8BYmSsfHZHei8ucoRACdZBRnNsG 20d2Uep8rijlifTJUNKMc4k3I1Y1T0xB9WV7n1qCfxknjtQaK5eGNvyjrSB2C06x TyGO3GnfPevTh79iD3cHgE8IVDCrwV68lM4FhhumruisQ=; Received: (qmail 4728 invoked by alias); 23 Aug 2012 17:00:24 -0000 Received: (qmail 4573 invoked by uid 22791); 23 Aug 2012 17:00:08 -0000 X-SWARE-Spam-Status: No, hits=-4.2 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, KHOP_RCVD_TRUST, RCVD_IN_DNSWL_LOW, RCVD_IN_HOSTKARMA_YE, TW_ZJ X-Spam-Check-By: sourceware.org Received: from mail-pz0-f47.google.com (HELO mail-pz0-f47.google.com) (209.85.210.47) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 23 Aug 2012 16:59:47 +0000 Received: by daks35 with SMTP id s35so486723dak.20 for ; Thu, 23 Aug 2012 09:59:47 -0700 (PDT) MIME-Version: 1.0 Received: by 10.68.240.138 with SMTP id wa10mr6009803pbc.145.1345741187333; Thu, 23 Aug 2012 09:59:47 -0700 (PDT) Received: by 10.66.248.131 with HTTP; Thu, 23 Aug 2012 09:59:47 -0700 (PDT) Date: Thu, 23 Aug 2012 18:59:47 +0200 Message-ID: Subject: [PATCH, middle-end]: Introduce TARGET_REJECT_COMBINED_INSN target hook From: Uros Bizjak To: gcc-patches@gcc.gnu.org Cc: Oleg Endo , Richard Guenther , Jakub Jelinek , Yuri Rumyantsev , Igor Zamyatin 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 Hello! This patch introduces TARGET_REJECT_COMBINED_INSN target hook, so targets are able to reject combinations of two or more insns. The hook is called from recog_for_combine, so it is the target that has the final say on the combined insn. This target hook will be used in a follow-up x86 patch that rejects instructions where hard registers don't fit into operand register constraint. 2012-08-23 Uros Bizjak * target.def (reject_combined_insn): New target hook. * doc/tm.texi.in (TARGET_REJECT_COMBINED_INSN): New hook. * doc/tm.texi: Regenerated. * combine.c (recog_for_combine): Call targetm.reject_combined_insn to allow targets to reject combined insn. Bootstrapped and regression tested on x86_64-pc-linux-gnu. OK for mainline? Uros. Index: combine.c =================================================================== --- combine.c (revision 190500) +++ combine.c (working copy) @@ -10507,6 +10507,7 @@ recog_for_combine (rtx *pnewpat, rtx insn, rtx *pn int i; rtx notes = 0; rtx old_notes, old_pat; + int old_icode; /* If PAT is a PARALLEL, check to see if it contains the CLOBBER we use to indicate that something didn't match. If we find such a @@ -10566,6 +10567,7 @@ recog_for_combine (rtx *pnewpat, rtx insn, rtx *pn print_rtl_single (dump_file, pat); } } + PATTERN (insn) = old_pat; REG_NOTES (insn) = old_notes; @@ -10607,6 +10609,29 @@ recog_for_combine (rtx *pnewpat, rtx insn, rtx *pn pat = newpat; } + if (insn_code_number >= 0 + && insn_code_number != NOOP_MOVE_INSN_CODE) + { + old_pat = PATTERN (insn); + old_notes = REG_NOTES (insn); + old_icode = INSN_CODE (insn); + PATTERN (insn) = pat; + REG_NOTES (insn) = notes; + + /* Allow targets to reject combined insn. */ + if (targetm.reject_combined_insn (insn)) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fputs ("Instruction not appropriate for target.", + dump_file); + insn_code_number = -1; + } + + PATTERN (insn) = old_pat; + REG_NOTES (insn) = old_notes; + INSN_CODE (insn) = old_icode; + } + *pnewpat = pat; *pnotes = notes; Index: doc/tm.texi =================================================================== --- doc/tm.texi (revision 190500) +++ doc/tm.texi (working copy) @@ -10938,6 +10938,12 @@ By default, the RTL loop optimizer does not use a loops containing function calls or branch on table instructions. @end deftypefn +@deftypefn {Target Hook} bool TARGET_REJECT_COMBINED_INSN (rtx @var{insn}) + +Take an instruction in @var{insn} and return @code{true} if the insn +should be rejected as a combination of two or more instructions. +@end deftypefn + @defmac MD_CAN_REDIRECT_BRANCH (@var{branch1}, @var{branch2}) Take a branch insn in @var{branch1} and another in @var{branch2}. Index: doc/tm.texi.in =================================================================== --- doc/tm.texi.in (revision 190500) +++ doc/tm.texi.in (working copy) @@ -10796,6 +10796,12 @@ By default, the RTL loop optimizer does not use a loops containing function calls or branch on table instructions. @end deftypefn +@hook TARGET_REJECT_COMBINED_INSN + +Take an instruction in @var{insn} and return @code{true} if the insn +should be rejected as a combination of two or more instructions. +@end deftypefn + @defmac MD_CAN_REDIRECT_BRANCH (@var{branch1}, @var{branch2}) Take a branch insn in @var{branch1} and another in @var{branch2}. Index: target.def =================================================================== --- target.def (revision 190500) +++ target.def (working copy) @@ -1984,7 +1984,15 @@ DEFHOOK const char *, (const_rtx insn), default_invalid_within_doloop) +/* Returns true if the combined insn should be rejected + for some reason. */ DEFHOOK +(reject_combined_insn, + "", + bool, (rtx insn), + hook_bool_rtx_false) + +DEFHOOK (valid_dllimport_attribute_p, "@var{decl} is a variable or function with @code{__attribute__((dllimport))}\ specified. Use this hook if the target needs to add extra validation\