From patchwork Sat Jan 18 20:15:57 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 312330 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 7A9C72C0079 for ; Sun, 19 Jan 2014 07:16:11 +1100 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:mime-version:content-type; q=dns; s=default; b=iAPNHa2FgFvIFA829VbRMaHQxftlisjN8v3jJ4ZvJqw0h/FM8V 00c8axi/U3P8CtcxgIs26wlakv4B26VSmuCG/c9rTY73wYs88x7K1YYLi3QNvAQv eYaPjCv1oLlFXhuo/k2tX1vfOsurP8dsBjpS+F01lHpyhBBX7K8LXKh1g= 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:date :from:to:cc:subject:message-id:mime-version:content-type; s= default; bh=Xod/tRpBT23TkPXfPfP4+rqwWNE=; b=YUP6QsXQ2xzIjegkgxEc vjxbRhONXx64BcfBvac/X2duPyLwP56MK+GGXp8j7N2gUtU+1/GUamiG4c034y97 VaGiDOc82qoJ8IlLiJpjnEDPiR6k43/o+G4zhjhB2U36K20+9f6Sl5cR0Po5CT0d rBNPJQMH+EaYdVReku+VdfU= Received: (qmail 31832 invoked by alias); 18 Jan 2014 20:16:03 -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 31822 invoked by uid 89); 18 Jan 2014 20:16:03 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-gg0-f179.google.com Received: from mail-gg0-f179.google.com (HELO mail-gg0-f179.google.com) (209.85.161.179) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Sat, 18 Jan 2014 20:16:02 +0000 Received: by mail-gg0-f179.google.com with SMTP id e5so1702981ggh.38 for ; Sat, 18 Jan 2014 12:16:00 -0800 (PST) X-Received: by 10.236.36.40 with SMTP id v28mr3770377yha.88.1390076160128; Sat, 18 Jan 2014 12:16:00 -0800 (PST) Received: from gnu-tools-1.localdomain (76-220-57-190.lightspeed.sntcca.sbcglobal.net. [76.220.57.190]) by mx.google.com with ESMTPSA id m68sm26700992yhj.22.2014.01.18.12.15.59 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 18 Jan 2014 12:15:59 -0800 (PST) Received: by gnu-tools-1.localdomain (Postfix, from userid 1000) id 7BA991A0403; Sat, 18 Jan 2014 12:15:57 -0800 (PST) Date: Sat, 18 Jan 2014 12:15:57 -0800 From: "H.J. Lu" To: Uros Bizjak Cc: gcc-patches@gcc.gnu.org Subject: PATCH: PR target/59379: [4.9 Regression] gomp_init_num_threads is compiled into an infinite loop with --with-arch=corei7 --with-cpu=slm Message-ID: <20140118201557.GA4402@gmail.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes For LEA operation with SImode_address_operand, which zero-extends SImode to DImode, ix86_split_lea_for_addr turns (set (reg:DI) ...) into (set (reg:SI) ...) We need to do (set (reg:DI) (zero_extend:DI (reg:SI))) at the end. If the LEA operation is (set (reg:DI) (zero_extend:DI (reg:SI))) we don't need to do it twice. This patch implements above. Tested on Linux/x86-64 without regressions. OK for trunk and release branches? Thanks. H.J. --- 2014-01-18 H.J. Lu PR target/59379 * config/i386/i386.c (ix86_split_lea_for_addr): Properly zero-extends SImode to DImode. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index ff210c8..346b0cb 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -18342,6 +18342,23 @@ ix86_split_lea_for_addr (rtx insn, rtx operands[], enum machine_mode mode) } else { + if (mode != GET_MODE (operands[0])) + { + gcc_assert (mode == SImode && GET_MODE (operands[0]) == DImode); + if ((!parts.disp || parts.disp == const0_rtx) + && ((parts.base && !parts.index) + || (!parts.base && parts.index))) + { + if (parts.base) + emit_insn (gen_zero_extendsidi2 (operands[0], + parts.base)); + else + emit_insn (gen_zero_extendsidi2 (operands[0], + parts.index)); + return; + } + } + if (!parts.base) { if (regno0 != regno2) @@ -18375,7 +18392,7 @@ ix86_split_lea_for_addr (rtx insn, rtx operands[], enum machine_mode mode) ix86_emit_binop (PLUS, mode, target, parts.disp); ix86_emit_binop (PLUS, mode, target, tmp1); - return; + goto check_mode; } ix86_emit_binop (PLUS, mode, target, tmp); @@ -18384,6 +18401,13 @@ ix86_split_lea_for_addr (rtx insn, rtx operands[], enum machine_mode mode) if (parts.disp && parts.disp != const0_rtx) ix86_emit_binop (PLUS, mode, target, parts.disp); } + +check_mode: + if (mode != GET_MODE (operands[0])) + { + gcc_assert (mode == SImode && GET_MODE (operands[0]) == DImode); + emit_insn (gen_zero_extendsidi2 (operands[0], target)); + } } /* Return true if it is ok to optimize an ADD operation to LEA