From patchwork Thu May 5 22:52:15 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Uros Bizjak X-Patchwork-Id: 619084 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 3r19Cn3jqxz9sD5 for ; Fri, 6 May 2016 08:52:36 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=XWFwpYoy; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:date:message-id:subject:from:to:cc:content-type; q=dns; s=default; b=Mwjs7F+ppxgmFHIkz2hDmWUnEX/YW+Mr0nbFSURErjM o7kqFFun5gUMxWeoovu6L1ARqi3Z243euSLyTyhnsu7/6/3lblQQgqaA2H0eF7yr t/QIHbsQclczIgf2RZkO8Kfi3UAeXh5MnZ3hkns+aeEFcYEqJRtVoX0f9PySF3mc = 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 :mime-version:date:message-id:subject:from:to:cc:content-type; s=default; bh=kiI3xJgUNJeBUXvvIm9lOADj5vc=; b=XWFwpYoyvINjYpPoc wBvyhU+x/CGW+UhoRgDLv6UBOCBiDOdHVqboAC10oSQe8ULQVttoZKgJrCL+3ZVf fDpEGGr0f8T8YBZ17eKNoJWvYNChonB9x8CYwIOvoOBK4+SlSZOE6jKvqOug0X2N I7veOzDD2ql5hd57CN5jhGcZ40= Received: (qmail 25737 invoked by alias); 5 May 2016 22:52:28 -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 25681 invoked by uid 89); 5 May 2016 22:52:27 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.5 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=20160506, 2016-05-06, broad, hello! X-HELO: mail-yw0-f172.google.com Received: from mail-yw0-f172.google.com (HELO mail-yw0-f172.google.com) (209.85.161.172) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Thu, 05 May 2016 22:52:17 +0000 Received: by mail-yw0-f172.google.com with SMTP id j74so149165908ywg.1 for ; Thu, 05 May 2016 15:52:17 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to:cc; bh=N/Xl4BloiOiJlGM52tg2rfnjn6hfu04osLfrUdR4te0=; b=kAIt7BRypC42qFT/WjklSC/2Ymj255EFLcktjiqeE5F3g3uvue4fiyl6O0NQCcyKtc 4i2xYg6Eq3UGmmE7Wv6yH6yw4FFpx6tfi/F0wMb/FSKGNJ4RIl54vlC5bgIrfLCZH2dE E+GdCP5/2qo/4XiQhtfN97QDpMQar2W76zFiBGJDusbUMV71Ea2yqmvGpgPPktOwB9sR wD1B/zmEwkTpAw3WeENaTZNWeWa9EFyPtoId2Kw3Qw8vpCSF+6Og/fiaG4VJJBk8LYpQ 3TTf9ZI9FB6BWf7Wa4/0/ZiMQ1nJxALWM4WX4x3cTzpUaLqisQ5mRVqFo1VDZ95u5gmd Mwvg== X-Gm-Message-State: AOPr4FX5PpZNKOLJYgK0xzMaH1r/KRtY1R5xkSXeWzT7PiKWbGRa7fvZt3jbLUglASumOeYsDnb96LduoA7Udg== MIME-Version: 1.0 X-Received: by 10.176.64.104 with SMTP id h95mr11318092uad.84.1462488735244; Thu, 05 May 2016 15:52:15 -0700 (PDT) Received: by 10.103.76.220 with HTTP; Thu, 5 May 2016 15:52:15 -0700 (PDT) Date: Fri, 6 May 2016 00:52:15 +0200 Message-ID: Subject: [PATCH, i386]: Fix too broad (mem,reg)->(const,reg) splitters From: Uros Bizjak To: "gcc-patches@gcc.gnu.org" Cc: "H.J. Lu" Hello! This patch fixes a bunch of too broad (mem,reg)->(const,reg) splitters, that block other similar splitters. The solution is to check, if the splitter will transform the insn in the splitter condition, instead of using FAIL in the splitter preparation statements. 2016-05-06 Uros Bizjak PR target/70873 * config/i386/i386-protos.h (ix86_standard_x87sse_constant_load_p): New prototype. * config/i386/i386.c (ix86_standard_x87sse_constant_load_p): New. * config/i386/i386.md (push mem splitter): Use find_constant_src in the splitter condition. (FP load splitter): Use ix86_standard_x87sse_constant_load_p in the splitter condition. (FP float_extend load splitter): Ditto. Patch was bootstrapped and regression tested on x86_64-linux-gnu {,-m32}. Committed to mainline SVN. Uros. diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h index 4145ed5..447f67e 100644 --- a/gcc/config/i386/i386-protos.h +++ b/gcc/config/i386/i386-protos.h @@ -52,6 +52,7 @@ extern const char *standard_80387_constant_opcode (rtx); extern rtx standard_80387_constant_rtx (int); extern int standard_sse_constant_p (rtx, machine_mode); extern const char *standard_sse_constant_opcode (rtx_insn *, rtx); +extern bool ix86_standard_x87sse_constant_load_p (const rtx_insn *, rtx); extern bool symbolic_reference_mentioned_p (rtx); extern bool extended_reg_mentioned_p (rtx); extern bool x86_extended_QIreg_mentioned_p (rtx_insn *); diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 9680aaf..05476f3 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -11219,6 +11219,26 @@ standard_sse_constant_opcode (rtx_insn *insn, rtx x) gcc_unreachable (); } +/* Returns true if INSN can be transformed from a memory load + to a supported FP constant load. */ + +bool +ix86_standard_x87sse_constant_load_p (const rtx_insn *insn, rtx dst) +{ + rtx src = find_constant_src (insn); + + gcc_assert (REG_P (dst)); + + if (src == NULL + || (SSE_REGNO_P (REGNO (dst)) + && standard_sse_constant_p (src, GET_MODE (dst)) != 1) + || (STACK_REGNO_P (REGNO (dst)) + && standard_80387_constant_p (src) < 1)) + return false; + + return true; +} + /* Returns true if OP contains a symbol reference */ bool diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index dd56b05..0bf01ab 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -3072,14 +3072,10 @@ (define_split [(set (match_operand:SF 0 "push_operand") (match_operand:SF 1 "memory_operand"))] - "reload_completed" + "reload_completed + && find_constant_src (insn)" [(set (match_dup 0) (match_dup 2))] -{ - operands[2] = find_constant_src (curr_insn); - - if (operands[2] == NULL_RTX) - FAIL; -}) + "operands[2] = find_constant_src (curr_insn);") (define_split [(set (match_operand 0 "push_operand") @@ -3601,19 +3597,10 @@ && (GET_MODE (operands[0]) == TFmode || GET_MODE (operands[0]) == XFmode || GET_MODE (operands[0]) == DFmode - || GET_MODE (operands[0]) == SFmode)" + || GET_MODE (operands[0]) == SFmode) + && ix86_standard_x87sse_constant_load_p (insn, operands[0])" [(set (match_dup 0) (match_dup 2))] -{ - operands[2] = find_constant_src (curr_insn); - - if (operands[2] == NULL_RTX - || (SSE_REGNO_P (REGNO (operands[0])) - && standard_sse_constant_p (operands[2], - GET_MODE (operands[0])) != 1) - || (STACK_REGNO_P (REGNO (operands[0])) - && standard_80387_constant_p (operands[2]) < 1)) - FAIL; -}) + "operands[2] = find_constant_src (curr_insn);") (define_split [(set (match_operand 0 "any_fp_register_operand") @@ -3621,19 +3608,10 @@ "reload_completed && (GET_MODE (operands[0]) == TFmode || GET_MODE (operands[0]) == XFmode - || GET_MODE (operands[0]) == DFmode)" + || GET_MODE (operands[0]) == DFmode) + && ix86_standard_x87sse_constant_load_p (insn, operands[0])" [(set (match_dup 0) (match_dup 2))] -{ - operands[2] = find_constant_src (curr_insn); - - if (operands[2] == NULL_RTX - || (SSE_REGNO_P (REGNO (operands[0])) - && standard_sse_constant_p (operands[2], - GET_MODE (operands[0])) != 1) - || (STACK_REGNO_P (REGNO (operands[0])) - && standard_80387_constant_p (operands[2]) < 1)) - FAIL; -}) + "operands[2] = find_constant_src (curr_insn);") ;; Split the load of -0.0 or -1.0 into fldz;fchs or fld1;fchs sequence (define_split