From patchwork Thu Jul 7 15:10:14 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 103681 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 03118B6F18 for ; Fri, 8 Jul 2011 01:10:48 +1000 (EST) Received: (qmail 20642 invoked by alias); 7 Jul 2011 15:10:44 -0000 Received: (qmail 20632 invoked by uid 22791); 7 Jul 2011 15:10:42 -0000 X-SWARE-Spam-Status: No, hits=-6.5 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_HI, SPF_HELO_PASS, TW_TM, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 07 Jul 2011 15:10:25 +0000 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p67FAHJt015909 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 7 Jul 2011 11:10:17 -0400 Received: from tyan-ft48-01.lab.bos.redhat.com (tyan-ft48-01.lab.bos.redhat.com [10.16.42.4]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p67FAGYJ004685 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 7 Jul 2011 11:10:16 -0400 Received: from tyan-ft48-01.lab.bos.redhat.com (localhost.localdomain [127.0.0.1]) by tyan-ft48-01.lab.bos.redhat.com (8.14.4/8.14.4) with ESMTP id p67FAFiA015945; Thu, 7 Jul 2011 17:10:15 +0200 Received: (from jakub@localhost) by tyan-ft48-01.lab.bos.redhat.com (8.14.4/8.14.4/Submit) id p67FAELB015944; Thu, 7 Jul 2011 17:10:14 +0200 Date: Thu, 7 Jul 2011 17:10:14 +0200 From: Jakub Jelinek To: "Joseph S. Myers" , Jason Merrill Cc: gcc-patches@gcc.gnu.org Subject: Re: [PATCH] Fix complex {*, /} real or real * complex handling in C FE (PR c/49644) Message-ID: <20110707151014.GQ2687@tyan-ft48-01.lab.bos.redhat.com> Reply-To: Jakub Jelinek References: <20110707125723.GO2687@tyan-ft48-01.lab.bos.redhat.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) 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 On Thu, Jul 07, 2011 at 02:55:45PM +0000, Joseph S. Myers wrote: > On Thu, 7 Jul 2011, Jakub Jelinek wrote: > > For MULT_EXPR and TRUNC_DIV_EXPR, both sides of COMPLEX_EXPR contain > > a copy of the non-complex operand, which means its side-effects can be > > evaluated twice. For PLUS_EXPR/MINUS_EXPR they appear just in one of > > the operands and thus it works fine as is. > > > > Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, > > ok for trunk/4.6? > > OK, but I think you need a similar patch for the C++ front end as well. Indeed, thanks. Attached is the corresponding C++ patch and simplified C patch (with c_save_expr calls right in the switch stmt for the cases that need it instead of another condition before). Jakub 2011-07-07 Jakub Jelinek PR c/49644 * typeck.c (cp_build_binary_op): For MULT_EXPR and TRUNC_DIV_EXPR with one non-complex and one complex argument, call save_expr on both operands. * g++.dg/torture/pr49644.C: New test. 2011-07-07 Jakub Jelinek PR c/49644 * c-typeck.c (build_binary_op): For MULT_EXPR and TRUNC_DIV_EXPR with one non-complex and one complex argument, call c_save_expr on both operands. * gcc.c-torture/execute/pr49644.c: New test. --- gcc/c-typeck.c.jj 2011-05-31 08:03:10.000000000 +0200 +++ gcc/c-typeck.c 2011-07-07 11:47:31.000000000 +0200 @@ -10040,6 +10040,7 @@ build_binary_op (location_t location, en { case MULT_EXPR: case TRUNC_DIV_EXPR: + op1 = c_save_expr (op1); imag = build2 (resultcode, real_type, imag, op1); /* Fall through. */ case PLUS_EXPR: @@ -10060,6 +10061,7 @@ build_binary_op (location_t location, en switch (code) { case MULT_EXPR: + op0 = c_save_expr (op0); imag = build2 (resultcode, real_type, op0, imag); /* Fall through. */ case PLUS_EXPR: --- gcc/testsuite/gcc.c-torture/execute/pr49644.c.jj 2011-07-07 11:48:34.000000000 +0200 +++ gcc/testsuite/gcc.c-torture/execute/pr49644.c 2011-07-07 11:35:52.000000000 +0200 @@ -0,0 +1,16 @@ +/* PR c/49644 */ + +extern void abort (void); + +int +main () +{ + _Complex double a[12], *c = a, s = 3.0 + 1.0i; + double b[12] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }, *d = b; + int i; + for (i = 0; i < 6; i++) + *c++ = *d++ * s; + if (c != a + 6 || d != b + 6) + abort (); + return 0; +} --- gcc/cp/typeck.c.jj 2011-06-21 16:45:52.000000000 +0200 +++ gcc/cp/typeck.c 2011-07-07 17:00:17.000000000 +0200 @@ -4338,6 +4338,7 @@ cp_build_binary_op (location_t location, { case MULT_EXPR: case TRUNC_DIV_EXPR: + op1 = save_expr (op1); imag = build2 (resultcode, real_type, imag, op1); /* Fall through. */ case PLUS_EXPR: @@ -4356,6 +4357,7 @@ cp_build_binary_op (location_t location, switch (code) { case MULT_EXPR: + op0 = save_expr (op0); imag = build2 (resultcode, real_type, op0, imag); /* Fall through. */ case PLUS_EXPR: --- gcc/testsuite/g++.dg/torture/pr49644.C.jj 2011-07-07 17:01:21.000000000 +0200 +++ gcc/testsuite/g++.dg/torture/pr49644.C 2011-07-07 17:01:27.000000000 +0200 @@ -0,0 +1,17 @@ +// PR c/49644 +// { dg-do run } + +extern "C" void abort (); + +int +main () +{ + _Complex double a[12], *c = a, s = 3.0 + 1.0i; + double b[12] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }, *d = b; + int i; + for (i = 0; i < 6; i++) + *c++ = *d++ * s; + if (c != a + 6 || d != b + 6) + abort (); + return 0; +}