From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16619 invoked by alias); 8 Aug 2012 18:05:33 -0000 Received: (qmail 16604 invoked by uid 22791); 8 Aug 2012 18:05:31 -0000 X-SWARE-Spam-Status: No, hits=-4.1 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_THREADED,MSGID_FROM_MTA_HEADER,RCVD_IN_HOSTKARMA_W,RCVD_IN_HOSTKARMA_WL,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from e06smtp14.uk.ibm.com (HELO e06smtp14.uk.ibm.com) (195.75.94.110) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 08 Aug 2012 18:05:16 +0000 Received: from /spool/local by e06smtp14.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 8 Aug 2012 19:05:15 +0100 Received: from b06cxnps3075.portsmouth.uk.ibm.com (9.149.109.195) by e06smtp14.uk.ibm.com (192.168.101.144) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 8 Aug 2012 19:05:14 +0100 Received: from d06av02.portsmouth.uk.ibm.com (d06av02.portsmouth.uk.ibm.com [9.149.37.228]) by b06cxnps3075.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q78I579p16711754 for ; Wed, 8 Aug 2012 18:05:07 GMT Received: from d06av02.portsmouth.uk.ibm.com (loopback [127.0.0.1]) by d06av02.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q78I5DfN009494 for ; Wed, 8 Aug 2012 12:05:13 -0600 Received: from tuxmaker.boeblingen.de.ibm.com (tuxmaker.boeblingen.de.ibm.com [9.152.85.9]) by d06av02.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with SMTP id q78I5B97009459; Wed, 8 Aug 2012 12:05:11 -0600 Message-Id: <201208081805.q78I5B97009459@d06av02.portsmouth.uk.ibm.com> Received: by tuxmaker.boeblingen.de.ibm.com (sSMTP sendmail emulation); Wed, 08 Aug 2012 20:05:11 +0200 Subject: Re: s390: Avoid CAS boolean output inefficiency To: rth@redhat.com (Richard Henderson) Date: Wed, 08 Aug 2012 18:05:00 -0000 From: "Ulrich Weigand" Cc: gcc-patches@gcc.gnu.org In-Reply-To: <50219309.5000403@redhat.com> from "Richard Henderson" at Aug 07, 2012 03:13:29 PM MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit x-cbid: 12080818-1948-0000-0000-0000029F276D Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2012-08/txt/msg00454.txt.bz2 Richard Henderson wrote: > On 08/07/2012 10:02 AM, Ulrich Weigand wrote: > > The following patch changes the builtin expander to pass a MEM oldval > > as-is to the back-end expander, so that the back-end can move the > > store to before the CC operation. With that patch I'm also seeing > > all the IPMs disappear. > ... > > What do you think about this solution? It has the advantage that > > we still get the same xor code if we actually do need the ipm ... > > I'm ok with that patch. Thanks! I've checked in the following version. Tested on s390x-ibm-linux with no regressions. Bye, Ulrich ChangeLog: * builtins.c (expand_builtin_atomic_compare_exchange): Pass old value operand as MEM to expand_atomic_compare_and_swap. * config/s390/s390.md ("atomic_compare_and_swap"): Accept nonimmediate_operand for old value; generate load and store if needed. * config/s390/s390.c (s390_expand_cs_hqi): Accept any operand as vtarget. Index: gcc/builtins.c =================================================================== *** gcc/builtins.c (revision 190226) --- gcc/builtins.c (working copy) *************** expand_builtin_atomic_compare_exchange ( *** 5376,5381 **** --- 5376,5382 ---- expect = expand_normal (CALL_EXPR_ARG (exp, 1)); expect = convert_memory_address (Pmode, expect); + expect = gen_rtx_MEM (mode, expect); desired = expand_expr_force_mode (CALL_EXPR_ARG (exp, 2), mode); weak = CALL_EXPR_ARG (exp, 3); *************** expand_builtin_atomic_compare_exchange ( *** 5383,5396 **** if (host_integerp (weak, 0) && tree_low_cst (weak, 0) != 0) is_weak = true; ! oldval = copy_to_reg (gen_rtx_MEM (mode, expect)); ! if (!expand_atomic_compare_and_swap ((target == const0_rtx ? NULL : &target), &oldval, mem, oldval, desired, is_weak, success, failure)) return NULL_RTX; ! emit_move_insn (gen_rtx_MEM (mode, expect), oldval); return target; } --- 5384,5398 ---- if (host_integerp (weak, 0) && tree_low_cst (weak, 0) != 0) is_weak = true; ! oldval = expect; if (!expand_atomic_compare_and_swap ((target == const0_rtx ? NULL : &target), &oldval, mem, oldval, desired, is_weak, success, failure)) return NULL_RTX; ! if (oldval != expect) ! emit_move_insn (expect, oldval); ! return target; } Index: gcc/config/s390/s390.c =================================================================== *** gcc/config/s390/s390.c (revision 190226) --- gcc/config/s390/s390.c (working copy) *************** s390_expand_cs_hqi (enum machine_mode mo *** 4825,4831 **** rtx res = gen_reg_rtx (SImode); rtx csloop = NULL, csend = NULL; - gcc_assert (register_operand (vtarget, VOIDmode)); gcc_assert (MEM_P (mem)); init_alignment_context (&ac, mem, mode); --- 4825,4830 ---- Index: gcc/config/s390/s390.md =================================================================== *** gcc/config/s390/s390.md (revision 190226) --- gcc/config/s390/s390.md (working copy) *************** *** 8870,8876 **** (define_expand "atomic_compare_and_swap" [(match_operand:SI 0 "register_operand") ;; bool success output ! (match_operand:DGPR 1 "register_operand") ;; oldval output (match_operand:DGPR 2 "memory_operand") ;; memory (match_operand:DGPR 3 "register_operand") ;; expected intput (match_operand:DGPR 4 "register_operand") ;; newval intput --- 8870,8876 ---- (define_expand "atomic_compare_and_swap" [(match_operand:SI 0 "register_operand") ;; bool success output ! (match_operand:DGPR 1 "nonimmediate_operand");; oldval output (match_operand:DGPR 2 "memory_operand") ;; memory (match_operand:DGPR 3 "register_operand") ;; expected intput (match_operand:DGPR 4 "register_operand") ;; newval intput *************** *** 8879,8887 **** (match_operand:SI 7 "const_int_operand")] ;; failure model "" { ! rtx cc, cmp; emit_insn (gen_atomic_compare_and_swap_internal ! (operands[1], operands[2], operands[3], operands[4])); cc = gen_rtx_REG (CCZ1mode, CC_REGNUM); cmp = gen_rtx_EQ (SImode, cc, const0_rtx); emit_insn (gen_cstorecc4 (operands[0], cmp, cc, const0_rtx)); --- 8879,8900 ---- (match_operand:SI 7 "const_int_operand")] ;; failure model "" { ! rtx cc, cmp, output = operands[1]; ! ! if (!register_operand (output, mode)) ! output = gen_reg_rtx (mode); ! emit_insn (gen_atomic_compare_and_swap_internal ! (output, operands[2], operands[3], operands[4])); ! ! /* We deliberately accept non-register operands in the predicate ! to ensure the write back to the output operand happens *before* ! the store-flags code below. This makes it easier for combine ! to merge the store-flags code with a potential test-and-branch ! pattern following (immediately!) afterwards. */ ! if (output != operands[1]) ! emit_move_insn (operands[1], output); ! cc = gen_rtx_REG (CCZ1mode, CC_REGNUM); cmp = gen_rtx_EQ (SImode, cc, const0_rtx); emit_insn (gen_cstorecc4 (operands[0], cmp, cc, const0_rtx)); *************** *** 8890,8896 **** (define_expand "atomic_compare_and_swap" [(match_operand:SI 0 "register_operand") ;; bool success output ! (match_operand:HQI 1 "register_operand") ;; oldval output (match_operand:HQI 2 "memory_operand") ;; memory (match_operand:HQI 3 "general_operand") ;; expected intput (match_operand:HQI 4 "general_operand") ;; newval intput --- 8903,8909 ---- (define_expand "atomic_compare_and_swap" [(match_operand:SI 0 "register_operand") ;; bool success output ! (match_operand:HQI 1 "nonimmediate_operand") ;; oldval output (match_operand:HQI 2 "memory_operand") ;; memory (match_operand:HQI 3 "general_operand") ;; expected intput (match_operand:HQI 4 "general_operand") ;; newval intput -- Dr. Ulrich Weigand GNU Toolchain for Linux on System z and Cell BE Ulrich.Weigand@de.ibm.com