From patchwork Tue Jan 8 08:51:53 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhenqiang Chen X-Patchwork-Id: 210315 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 C77FC2C0093 for ; Tue, 8 Jan 2013 19:52:14 +1100 (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=1358239935; h=Comment: DomainKey-Signature:Received:Received:Received:Received: MIME-Version:Received:Received:Date:Message-ID:Subject:From:To: Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:Sender:Delivered-To; bh=IsLuGzM XjKIREKZe1RvpSu4tCMA=; b=dXliPcJfuGm5HUjlzJ2OtKKqXEELOpmiY3bR9ed zzPcRbeIeAl8niL6xVBuOaU86l1ECVoj+MILTj4KON8g4p1sAyRmy+o+tDJ2jAkN sFqVrwtTVpMmsX+lqMD/FV9dxAJslyDcpZVxNaRrUgSLpNLl5GAjHpySRA2Oocn+ Z9ts= 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:X-Google-DKIM-Signature:MIME-Version:Received:Received:Date:Message-ID:Subject:From:To:Content-Type:X-Gm-Message-State:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=EE03mmXJjJA+xfXvcB8GymVHYaZ1OcPBKd5ROv8oj08pw2GD/123Qx6Jv+3NoU d4d6DhAFJSAejq9gownf1TGrvzwkIRYnroS30oWHAQ3wsZixQ6ePOXY7YbHjighX lcDEd8uKbPjedgO1th0ODcddCHsniI+PRBOJxhRnp0Exs=; Received: (qmail 27559 invoked by alias); 8 Jan 2013 08:52:05 -0000 Received: (qmail 27547 invoked by uid 22791); 8 Jan 2013 08:52:01 -0000 X-SWARE-Spam-Status: No, hits=-2.1 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, RCVD_IN_DNSWL_LOW, RCVD_IN_HOSTKARMA_YE, TW_FC, TW_OV, TW_VT, TW_VW X-Spam-Check-By: sourceware.org Received: from mail-la0-f52.google.com (HELO mail-la0-f52.google.com) (209.85.215.52) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 08 Jan 2013 08:51:55 +0000 Received: by mail-la0-f52.google.com with SMTP id fq12so166422lab.11 for ; Tue, 08 Jan 2013 00:51:53 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type :x-gm-message-state; bh=0d4vnhbNUd0XJq+W1CyKeXOhMubkPQKHmLCC9ySfQok=; b=CCgNROAcMLaw38ph2wPOZvzna/ikG0QF5PomB2Bs6Jkp7Qv9eLhqlWF/QWXMWPDvHw nXO5BV2NdqEdW8m/zJq+aJwRYfg6KomIPANtEF1+Ko580CDozcjhmozRpBSxB7q0voIO i6bHFZjz8kosOnSkVo2yBDW1BM6jjffbBPCWtMnXzDq40CrmJ157sXjyRKN9MdT1JoO/ stdLsw3bpmifNXsbib43vEF2ifXzFY44AsVRxPh2IKKaW7eNHvpBaL7TQcHjSVFuc7O0 RU0JIhRvBBc4xqbB0spg/tHqK3BdtEEVDivoTUwfS/T8+ErtcMweYHr3f8xKB9wzdLZ8 KFYw== MIME-Version: 1.0 Received: by 10.112.36.137 with SMTP id q9mr26362794lbj.42.1357635113596; Tue, 08 Jan 2013 00:51:53 -0800 (PST) Received: by 10.112.32.73 with HTTP; Tue, 8 Jan 2013 00:51:53 -0800 (PST) Date: Tue, 8 Jan 2013 16:51:53 +0800 Message-ID: Subject: [PATCH] Enhance ifcvt conditional execution to handle IF-THEN-ELSE From: Zhenqiang Chen To: gcc-patches@gcc.gnu.org X-Gm-Message-State: ALoCoQkttcYM6WvOdynR7k1X/yDPhvXYwhHwTVHnBrznLApsbjpSIIxE1M1EcReqMIJbA/j0eDPq 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 Hi, max (MAX_CONDITIONAL_EXECUTE) is doubled for IF-THEN-ELSE since there is one more JUMP for the taken branch to goto the successor of IF-THEN-ELSE. But when the last JUMP is a RETURN, the additional JUMP can be optimized. Here are the two different assemble codes the attached test case (-O2 -mthumb) for ARM. IT block (current result): cmp r0, #0 itete lt rsblt r0, r0, #2 movwge r3, #21846 addlt r0, r0, r0, lsl #1 movtge r3, 21845 iteee lt lsllt r0, r0, #1 subge r0, r0, #2 smullge r2, r3, r3, r0 subge r0, r3, r0, asr #31 bx lr Branch (after patch): cmp r0, #0 blt .L5 movw r3, #21846 subs r0, r0, #2 movt r3, 21845 smull r2, r3, r3, r0 sub r0, r3, r0, asr #31 bx lr .L5: rsb r0, r0, #2 add r0, r0, r0, lsl #1 lsls r0, r0, #1 bx lr In general, I think the later one will have better performance. The patch will check whether there is RETURN. If has, do not double max. No make check regression and no performance regression for SPECINT2000 for ARM. Is it OK? Thanks! -Zhenqiang ChangeLog: 2013-01-08 Zhenqiang Chen * ifcvt.c (cond_exec_process_if_block): Do not increase max when there has RETURN in IF-THEN-ELSE. testsuite/ChangeLog: * gcc.target/arm/if-then-else-return.c: New. diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index b518b0e..70cb53a 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -443,6 +443,8 @@ cond_exec_process_if_block (ce_if_block_t * ce_info, rtx else_first_tail = NULL_RTX; /* First match at the tail of ELSE */ int then_n_insns, else_n_insns, n_insns; enum rtx_code false_code; + bool has_return_p = FALSE; + rtx insn; /* If test is comprised of && or || elements, and we've failed at handling all of them together, just use the last test if it is the special case of @@ -478,11 +480,19 @@ cond_exec_process_if_block (ce_if_block_t * ce_info, n_insns = then_n_insns; max = MAX_CONDITIONAL_EXECUTE; + insn = BB_END (then_bb); + if (JUMP_P (insn) && ANY_RETURN_P (PATTERN (insn))) + has_return_p = TRUE; + if (else_bb) { int n_matching; + insn = BB_END (else_bb); + if (!has_return_p && JUMP_P (insn) && ANY_RETURN_P (PATTERN (insn))) + has_return_p = TRUE; - max *= 2; + if (!has_return_p) + max *= 2; else_start = first_active_insn (else_bb); else_end = last_active_insn (else_bb, TRUE); else_n_insns = ce_info->num_else_insns = count_bb_insns (else_bb);