From patchwork Tue Mar 22 03:18:27 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nathan Froyd X-Patchwork-Id: 87856 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 31B68B6F06 for ; Tue, 22 Mar 2011 14:19:01 +1100 (EST) Received: (qmail 30548 invoked by alias); 22 Mar 2011 03:18:49 -0000 Received: (qmail 30225 invoked by uid 22791); 22 Mar 2011 03:18:45 -0000 X-SWARE-Spam-Status: No, hits=-1.7 required=5.0 tests=AWL, BAYES_00, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 22 Mar 2011 03:18:37 +0000 Received: (qmail 21142 invoked from network); 22 Mar 2011 03:18:34 -0000 Received: from unknown (HELO codesourcery.com) (froydnj@127.0.0.2) by mail.codesourcery.com with ESMTPA; 22 Mar 2011 03:18:34 -0000 From: Nathan Froyd To: gcc-patches@gcc.gnu.org Subject: [PATCH 2/2] refactor emit_*_{after, before}{, _setloc} using common functions Date: Mon, 21 Mar 2011 23:18:27 -0400 Message-Id: <1300763907-15774-3-git-send-email-froydnj@codesourcery.com> In-Reply-To: <1300763907-15774-1-git-send-email-froydnj@codesourcery.com> References: <1300763907-15774-1-git-send-email-froydnj@codesourcery.com> X-IsSubscribed: yes 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 This patch builds on the previous one to refactor the close cousins of the *_noloc family. I attempted to separate these out into separate patches, one dealing with *_setloc and the other dealing with the remainder, but I did not trust myself to do it correctly even with magit's help. * emit-rtl.c (emit_pattern_after_setloc): New function. (emit_insn_after_setloc, emit_jump_insn_after_setloc): Call it. (emit_call_insn_after_setloc, emit_debug_insn_after_setloc): Likewise. (emit_pattern_after): New function. (emit_insn_after, emit_jump_insn_after): Call it. (emit_call_insn_after, emit_debug_insn_after): Likewise. (emit_pattern_before_setloc): New function. (emit_insn_before_setloc, emit_jump_insn_before_setloc): Call it. (emit_call_insn_before_setloc, emit_debug_insn_before_setloc): Likewise. (emit_pattern_before): New function. (emit_insn_before, emit_jump_insn_before): Call it. (emit_call_insn_before, emit_debug_insn_before): Likewise. diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 9b6f0f8..aabdc73 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -4316,11 +4316,14 @@ emit_note_after (enum insn_note subtype, rtx after) return note; } -/* Like emit_insn_after_noloc, but set INSN_LOCATOR according to SCOPE. */ -rtx -emit_insn_after_setloc (rtx pattern, rtx after, int loc) +/* Insert PATTERN after AFTER, setting its INSN_LOCATION to LOC. + MAKE_RAW indicates how to turn PATTERN into a real insn. */ + +static rtx +emit_pattern_after_setloc (rtx pattern, rtx after, int loc, + rtx (*make_raw) (rtx)) { - rtx last = emit_insn_after_noloc (pattern, after, NULL); + rtx last = emit_pattern_after_noloc (pattern, after, NULL, make_raw); if (pattern == NULL_RTX || !loc) return last; @@ -4337,135 +4340,101 @@ emit_insn_after_setloc (rtx pattern, rtx after, int loc) return last; } -/* Like emit_insn_after_noloc, but set INSN_LOCATOR according to AFTER. */ -rtx -emit_insn_after (rtx pattern, rtx after) +/* Insert PATTERN after AFTER. MAKE_RAW indicates how to turn PATTERN + into a real insn. SKIP_DEBUG_INSNS indicates whether to insert after + any DEBUG_INSNs. */ + +static rtx +emit_pattern_after (rtx pattern, rtx after, bool skip_debug_insns, + rtx (*make_raw) (rtx)) { rtx prev = after; - while (DEBUG_INSN_P (prev)) - prev = PREV_INSN (prev); + if (skip_debug_insns) + while (DEBUG_INSN_P (prev)) + prev = PREV_INSN (prev); if (INSN_P (prev)) - return emit_insn_after_setloc (pattern, after, INSN_LOCATOR (prev)); + return emit_pattern_after_setloc (pattern, after, INSN_LOCATOR (prev), + make_raw); else - return emit_insn_after_noloc (pattern, after, NULL); + return emit_pattern_after_noloc (pattern, after, NULL, make_raw); } -/* Like emit_jump_insn_after_noloc, but set INSN_LOCATOR according to SCOPE. */ +/* Like emit_insn_after_noloc, but set INSN_LOCATOR according to LOC. */ rtx -emit_jump_insn_after_setloc (rtx pattern, rtx after, int loc) +emit_insn_after_setloc (rtx pattern, rtx after, int loc) { - rtx last = emit_jump_insn_after_noloc (pattern, after); + return emit_pattern_after_setloc (pattern, after, loc, make_insn_raw); +} - if (pattern == NULL_RTX || !loc) - return last; +/* Like emit_insn_after_noloc, but set INSN_LOCATOR according to AFTER. */ +rtx +emit_insn_after (rtx pattern, rtx after) +{ + return emit_pattern_after (pattern, after, true, make_insn_raw); +} - after = NEXT_INSN (after); - while (1) - { - if (active_insn_p (after) && !INSN_LOCATOR (after)) - INSN_LOCATOR (after) = loc; - if (after == last) - break; - after = NEXT_INSN (after); - } - return last; +/* Like emit_jump_insn_after_noloc, but set INSN_LOCATOR according to LOC. */ +rtx +emit_jump_insn_after_setloc (rtx pattern, rtx after, int loc) +{ + return emit_pattern_after_setloc (pattern, after, loc, make_jump_insn_raw); } /* Like emit_jump_insn_after_noloc, but set INSN_LOCATOR according to AFTER. */ rtx emit_jump_insn_after (rtx pattern, rtx after) { - rtx prev = after; - - while (DEBUG_INSN_P (prev)) - prev = PREV_INSN (prev); - - if (INSN_P (prev)) - return emit_jump_insn_after_setloc (pattern, after, INSN_LOCATOR (prev)); - else - return emit_jump_insn_after_noloc (pattern, after); + return emit_pattern_after (pattern, after, true, make_jump_insn_raw); } -/* Like emit_call_insn_after_noloc, but set INSN_LOCATOR according to SCOPE. */ +/* Like emit_call_insn_after_noloc, but set INSN_LOCATOR according to LOC. */ rtx emit_call_insn_after_setloc (rtx pattern, rtx after, int loc) { - rtx last = emit_call_insn_after_noloc (pattern, after); - - if (pattern == NULL_RTX || !loc) - return last; - - after = NEXT_INSN (after); - while (1) - { - if (active_insn_p (after) && !INSN_LOCATOR (after)) - INSN_LOCATOR (after) = loc; - if (after == last) - break; - after = NEXT_INSN (after); - } - return last; + return emit_pattern_after_setloc (pattern, after, loc, make_call_insn_raw); } /* Like emit_call_insn_after_noloc, but set INSN_LOCATOR according to AFTER. */ rtx emit_call_insn_after (rtx pattern, rtx after) { - rtx prev = after; - - while (DEBUG_INSN_P (prev)) - prev = PREV_INSN (prev); - - if (INSN_P (prev)) - return emit_call_insn_after_setloc (pattern, after, INSN_LOCATOR (prev)); - else - return emit_call_insn_after_noloc (pattern, after); + return emit_pattern_after (pattern, after, true, make_call_insn_raw); } -/* Like emit_debug_insn_after_noloc, but set INSN_LOCATOR according to SCOPE. */ +/* Like emit_debug_insn_after_noloc, but set INSN_LOCATOR according to LOC. */ rtx emit_debug_insn_after_setloc (rtx pattern, rtx after, int loc) { - rtx last = emit_debug_insn_after_noloc (pattern, after); - - if (pattern == NULL_RTX || !loc) - return last; - - after = NEXT_INSN (after); - while (1) - { - if (active_insn_p (after) && !INSN_LOCATOR (after)) - INSN_LOCATOR (after) = loc; - if (after == last) - break; - after = NEXT_INSN (after); - } - return last; + return emit_pattern_after_setloc (pattern, after, loc, make_debug_insn_raw); } /* Like emit_debug_insn_after_noloc, but set INSN_LOCATOR according to AFTER. */ rtx emit_debug_insn_after (rtx pattern, rtx after) { - if (INSN_P (after)) - return emit_debug_insn_after_setloc (pattern, after, INSN_LOCATOR (after)); - else - return emit_debug_insn_after_noloc (pattern, after); + return emit_pattern_after (pattern, after, false, make_debug_insn_raw); } -/* Like emit_insn_before_noloc, but set INSN_LOCATOR according to SCOPE. */ -rtx -emit_insn_before_setloc (rtx pattern, rtx before, int loc) +/* Insert PATTERN before BEFORE, setting its INSN_LOCATION to LOC. + MAKE_RAW indicates how to turn PATTERN into a real insn. INSNP + indicates if PATTERN is meant for an INSN as opposed to a JUMP_INSN, + CALL_INSN, etc. */ + +static rtx +emit_pattern_before_setloc (rtx pattern, rtx before, int loc, bool insnp, + rtx (*make_raw) (rtx)) { rtx first = PREV_INSN (before); - rtx last = emit_insn_before_noloc (pattern, before, NULL); + rtx last = emit_pattern_before_noloc (pattern, before, + insnp ? before : NULL_RTX, + NULL, make_raw); - if (pattern == NULL_RTX || !loc) + if (pattern == NULL_RTX || (!loc && insnp)) return last; - if (!first) + if (!first && insnp) first = get_insns (); else first = NEXT_INSN (first); @@ -4480,127 +4449,93 @@ emit_insn_before_setloc (rtx pattern, rtx before, int loc) return last; } -/* Like emit_insn_before_noloc, but set INSN_LOCATOR according to BEFORE. */ -rtx -emit_insn_before (rtx pattern, rtx before) +/* Insert PATTERN before BEFORE. MAKE_RAW indicates how to turn PATTERN + into a real insn. SKIP_DEBUG_INSNS indicates whether to insert + before any DEBUG_INSNs. INSNP indicates if PATTERN is meant for an + INSN as opposed to a JUMP_INSN, CALL_INSN, etc. */ + +static rtx +emit_pattern_before (rtx pattern, rtx before, bool skip_debug_insns, + bool insnp, rtx (*make_raw) (rtx)) { rtx next = before; - while (DEBUG_INSN_P (next)) - next = PREV_INSN (next); + if (skip_debug_insns) + while (DEBUG_INSN_P (next)) + next = PREV_INSN (next); if (INSN_P (next)) - return emit_insn_before_setloc (pattern, before, INSN_LOCATOR (next)); + return emit_pattern_before_setloc (pattern, before, INSN_LOCATOR (next), + insnp, make_raw); else - return emit_insn_before_noloc (pattern, before, NULL); + return emit_pattern_before_noloc (pattern, before, + insnp ? before : NULL_RTX, + NULL, make_raw); } -/* like emit_insn_before_noloc, but set insn_locator according to scope. */ +/* Like emit_insn_before_noloc, but set INSN_LOCATOR according to LOC. */ rtx -emit_jump_insn_before_setloc (rtx pattern, rtx before, int loc) +emit_insn_before_setloc (rtx pattern, rtx before, int loc) { - rtx first = PREV_INSN (before); - rtx last = emit_jump_insn_before_noloc (pattern, before); + return emit_pattern_before_setloc (pattern, before, loc, true, + make_insn_raw); +} - if (pattern == NULL_RTX) - return last; +/* Like emit_insn_before_noloc, but set INSN_LOCATOR according to BEFORE. */ +rtx +emit_insn_before (rtx pattern, rtx before) +{ + return emit_pattern_before (pattern, before, true, true, make_insn_raw); +} - first = NEXT_INSN (first); - while (1) - { - if (active_insn_p (first) && !INSN_LOCATOR (first)) - INSN_LOCATOR (first) = loc; - if (first == last) - break; - first = NEXT_INSN (first); - } - return last; +/* like emit_insn_before_noloc, but set INSN_LOCATOR according to LOC. */ +rtx +emit_jump_insn_before_setloc (rtx pattern, rtx before, int loc) +{ + return emit_pattern_before_setloc (pattern, before, loc, false, + make_jump_insn_raw); } /* Like emit_jump_insn_before_noloc, but set INSN_LOCATOR according to BEFORE. */ rtx emit_jump_insn_before (rtx pattern, rtx before) { - rtx next = before; - - while (DEBUG_INSN_P (next)) - next = PREV_INSN (next); - - if (INSN_P (next)) - return emit_jump_insn_before_setloc (pattern, before, INSN_LOCATOR (next)); - else - return emit_jump_insn_before_noloc (pattern, before); + return emit_pattern_before (pattern, before, true, false, + make_jump_insn_raw); } -/* like emit_insn_before_noloc, but set insn_locator according to scope. */ +/* Like emit_insn_before_noloc, but set INSN_LOCATOR according to LOC. */ rtx emit_call_insn_before_setloc (rtx pattern, rtx before, int loc) { - rtx first = PREV_INSN (before); - rtx last = emit_call_insn_before_noloc (pattern, before); - - if (pattern == NULL_RTX) - return last; - - first = NEXT_INSN (first); - while (1) - { - if (active_insn_p (first) && !INSN_LOCATOR (first)) - INSN_LOCATOR (first) = loc; - if (first == last) - break; - first = NEXT_INSN (first); - } - return last; + return emit_pattern_before_setloc (pattern, before, loc, false, + make_call_insn_raw); } -/* like emit_call_insn_before_noloc, - but set insn_locator according to before. */ +/* Like emit_call_insn_before_noloc, + but set insn_locator according to BEFORE. */ rtx emit_call_insn_before (rtx pattern, rtx before) { - rtx next = before; - - while (DEBUG_INSN_P (next)) - next = PREV_INSN (next); - - if (INSN_P (next)) - return emit_call_insn_before_setloc (pattern, before, INSN_LOCATOR (next)); - else - return emit_call_insn_before_noloc (pattern, before); + return emit_pattern_before (pattern, before, true, false, + make_call_insn_raw); } -/* like emit_insn_before_noloc, but set insn_locator according to scope. */ +/* Like emit_insn_before_noloc, but set INSN_LOCATOR according to LOC. */ rtx emit_debug_insn_before_setloc (rtx pattern, rtx before, int loc) { - rtx first = PREV_INSN (before); - rtx last = emit_debug_insn_before_noloc (pattern, before); - - if (pattern == NULL_RTX) - return last; - - first = NEXT_INSN (first); - while (1) - { - if (active_insn_p (first) && !INSN_LOCATOR (first)) - INSN_LOCATOR (first) = loc; - if (first == last) - break; - first = NEXT_INSN (first); - } - return last; + return emit_pattern_before_setloc (pattern, before, loc, false, + make_debug_insn_raw); } -/* like emit_debug_insn_before_noloc, - but set insn_locator according to before. */ +/* Like emit_debug_insn_before_noloc, + but set insn_locator according to BEFORE. */ rtx emit_debug_insn_before (rtx pattern, rtx before) { - if (INSN_P (before)) - return emit_debug_insn_before_setloc (pattern, before, INSN_LOCATOR (before)); - else - return emit_debug_insn_before_noloc (pattern, before); + return emit_pattern_before (pattern, before, false, false, + make_debug_insn_raw); } /* Take X and emit it at the end of the doubly-linked