From patchwork Thu Oct 15 13:28:57 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Sandiford X-Patchwork-Id: 530704 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 A36591402BF for ; Fri, 16 Oct 2015 00:29:13 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=ymYTwQPb; 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:from :to:subject:date:message-id:mime-version:content-type :content-transfer-encoding; q=dns; s=default; b=dIEW+H6e503TxWQd B0lpcJTwH1ggTTafrtdjhqtRdIjm6Fovr3utaqsA/HA0A+4wXCnwKZX+SPwAlbuM 0l1j9ItKvmXQp+3G/5IRjmGJ6EJ+wZdU/o/w11RnYSupWiKX7DoZPp6Jd97oa8h3 cmR15kXsMfs8DQdiqcua+B18HxY= 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:from :to:subject:date:message-id:mime-version:content-type :content-transfer-encoding; s=default; bh=bcbCz4fH4fP/PeHx45K9Oh +2cqY=; b=ymYTwQPbyihD4r0mpqoP6adkyqPo2ygxOBl62Gx4GYUHOFyyfbPJ4w S4uCmjkRCG6TBT57Ya2RGEHaf0GDnts37g8NTAfmOwNbsUoTIrvpBUmvQucNkgUO yw9ed5sJ5UobXXf0va9RFJxUjhapxN5IHUvSojRWD6qYPSEKccUrY= Received: (qmail 37293 invoked by alias); 15 Oct 2015 13:29:06 -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 37282 invoked by uid 89); 15 Oct 2015 13:29:04 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.4 required=5.0 tests=AWL, BAYES_00, SPF_PASS autolearn=ham version=3.3.2 X-HELO: eu-smtp-delivery-143.mimecast.com Received: from eu-smtp-delivery-143.mimecast.com (HELO eu-smtp-delivery-143.mimecast.com) (207.82.80.143) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 15 Oct 2015 13:29:02 +0000 Received: from cam-owa2.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.140]) by eu-smtp-1.mimecast.com with ESMTP id uk-mta-10-aw6LHF8fRPGH8H8pd2v1-g-1; Thu, 15 Oct 2015 14:28:57 +0100 Received: from localhost ([10.1.2.79]) by cam-owa2.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 15 Oct 2015 14:28:57 +0100 From: Richard Sandiford To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, richard.sandiford@arm.com Subject: Remove fold_strip_sign_ops Date: Thu, 15 Oct 2015 14:28:57 +0100 Message-ID: <87d1wgi7l2.fsf@e105548-lin.cambridge.arm.com> User-Agent: Gnus/5.130012 (Ma Gnus v0.12) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 X-MC-Unique: aw6LHF8fRPGH8H8pd2v1-g-1 This patch deletes fold_strip_sign_ops in favour of the tree-ssa-backprop.c pass. Tested on x86_64-linux-gnu, aarch64-linux-gnu and arm-linux-gnueabi. OK to install? Thanks, Richard gcc/ * fold-const.h (fold_strip_sign_ops): Delete. * fold-const.c (fold_strip_sign_ops): Likewise. (fold_unary_loc, fold_binary_loc): Remove calls to it. * builtins.c (fold_builtin_cos, fold_builtin_cosh) (fold_builtin_ccos): Delete. (fold_builtin_pow): Don't call fold_strip_sign_ops. (fold_builtin_hypot, fold_builtin_copysign): Likewise. Remove fndecl argument. (fold_builtin_1): Update calls accordingly. Handle constant cos, cosh, ccos and ccosh here. gcc/testsuite/ * gcc.dg/builtins-86.c: XFAIL. * gcc.dg/torture/builtin-symmetric-1.c: Don't run at -O0. diff --git a/gcc/builtins.c b/gcc/builtins.c index b4ac535..1e4ec35 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -160,8 +160,6 @@ static rtx expand_builtin_fabs (tree, rtx, rtx); static rtx expand_builtin_signbit (tree, rtx); static tree fold_builtin_pow (location_t, tree, tree, tree, tree); static tree fold_builtin_powi (location_t, tree, tree, tree, tree); -static tree fold_builtin_cos (location_t, tree, tree, tree); -static tree fold_builtin_cosh (location_t, tree, tree, tree); static tree fold_builtin_tan (tree, tree); static tree fold_builtin_trunc (location_t, tree, tree); static tree fold_builtin_floor (location_t, tree, tree); @@ -7688,77 +7686,6 @@ fold_builtin_cproj (location_t loc, tree arg, tree type) return NULL_TREE; } -/* Fold function call to builtin cos, cosf, or cosl with argument ARG. - TYPE is the type of the return value. Return NULL_TREE if no - simplification can be made. */ - -static tree -fold_builtin_cos (location_t loc, - tree arg, tree type, tree fndecl) -{ - tree res, narg; - - if (!validate_arg (arg, REAL_TYPE)) - return NULL_TREE; - - /* Calculate the result when the argument is a constant. */ - if ((res = do_mpfr_arg1 (arg, type, mpfr_cos, NULL, NULL, 0))) - return res; - - /* Optimize cos(-x) into cos (x). */ - if ((narg = fold_strip_sign_ops (arg))) - return build_call_expr_loc (loc, fndecl, 1, narg); - - return NULL_TREE; -} - -/* Fold function call to builtin cosh, coshf, or coshl with argument ARG. - Return NULL_TREE if no simplification can be made. */ - -static tree -fold_builtin_cosh (location_t loc, tree arg, tree type, tree fndecl) -{ - if (validate_arg (arg, REAL_TYPE)) - { - tree res, narg; - - /* Calculate the result when the argument is a constant. */ - if ((res = do_mpfr_arg1 (arg, type, mpfr_cosh, NULL, NULL, 0))) - return res; - - /* Optimize cosh(-x) into cosh (x). */ - if ((narg = fold_strip_sign_ops (arg))) - return build_call_expr_loc (loc, fndecl, 1, narg); - } - - return NULL_TREE; -} - -/* Fold function call to builtin ccos (or ccosh if HYPER is TRUE) with - argument ARG. TYPE is the type of the return value. Return - NULL_TREE if no simplification can be made. */ - -static tree -fold_builtin_ccos (location_t loc, tree arg, tree type, tree fndecl, - bool hyper) -{ - if (validate_arg (arg, COMPLEX_TYPE) - && TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) == REAL_TYPE) - { - tree tmp; - - /* Calculate the result when the argument is a constant. */ - if ((tmp = do_mpc_arg1 (arg, type, (hyper ? mpc_cosh : mpc_cos)))) - return tmp; - - /* Optimize fn(-x) into fn(x). */ - if ((tmp = fold_strip_sign_ops (arg))) - return build_call_expr_loc (loc, fndecl, 1, tmp); - } - - return NULL_TREE; -} - /* Fold function call to builtin tan, tanf, or tanl with argument ARG. Return NULL_TREE if no simplification can be made. */ @@ -8174,10 +8101,9 @@ fold_builtin_bswap (tree fndecl, tree arg) NULL_TREE if no simplification can be made. */ static tree -fold_builtin_hypot (location_t loc, tree fndecl, - tree arg0, tree arg1, tree type) +fold_builtin_hypot (location_t loc, tree arg0, tree arg1, tree type) { - tree res, narg0, narg1; + tree res; if (!validate_arg (arg0, REAL_TYPE) || !validate_arg (arg1, REAL_TYPE)) @@ -8187,16 +8113,6 @@ fold_builtin_hypot (location_t loc, tree fndecl, if ((res = do_mpfr_arg2 (arg0, arg1, type, mpfr_hypot))) return res; - /* If either argument to hypot has a negate or abs, strip that off. - E.g. hypot(-x,fabs(y)) -> hypot(x,y). */ - narg0 = fold_strip_sign_ops (arg0); - narg1 = fold_strip_sign_ops (arg1); - if (narg0 || narg1) - { - return build_call_expr_loc (loc, fndecl, 2, narg0 ? narg0 : arg0, - narg1 ? narg1 : arg1); - } - /* If either argument is zero, hypot is fabs of the other. */ if (real_zerop (arg0)) return fold_build1_loc (loc, ABS_EXPR, type, arg1); @@ -8301,14 +8217,6 @@ fold_builtin_pow (location_t loc, tree fndecl, tree arg0, tree arg1, tree type) if (flag_unsafe_math_optimizations || !inexact) return build_real (type, x); } - - /* Strip sign ops from even integer powers. */ - if ((n & 1) == 0 && flag_unsafe_math_optimizations) - { - tree narg0 = fold_strip_sign_ops (arg0); - if (narg0) - return build_call_expr_loc (loc, fndecl, 2, narg0, arg1); - } } } @@ -8756,11 +8664,8 @@ fold_builtin_signbit (location_t loc, tree arg, tree type) be made. */ static tree -fold_builtin_copysign (location_t loc, tree fndecl, - tree arg1, tree arg2, tree type) +fold_builtin_copysign (location_t loc, tree arg1, tree arg2, tree type) { - tree tem; - if (!validate_arg (arg1, REAL_TYPE) || !validate_arg (arg2, REAL_TYPE)) return NULL_TREE; @@ -8791,11 +8696,6 @@ fold_builtin_copysign (location_t loc, tree fndecl, fold_build1_loc (loc, ABS_EXPR, type, arg1), arg2); - /* Strip sign changing operations for the first argument. */ - tem = fold_strip_sign_ops (arg1); - if (tem) - return build_call_expr_loc (loc, fndecl, 2, tem, arg2); - return NULL_TREE; } @@ -9696,10 +9596,16 @@ fold_builtin_1 (location_t loc, tree fndecl, tree arg0) break; CASE_FLT_FN (BUILT_IN_CCOS): - return fold_builtin_ccos (loc, arg0, type, fndecl, /*hyper=*/ false); + if (validate_arg (arg0, COMPLEX_TYPE) + && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE) + return do_mpc_arg1 (arg0, type, mpc_cos); + break; CASE_FLT_FN (BUILT_IN_CCOSH): - return fold_builtin_ccos (loc, arg0, type, fndecl, /*hyper=*/ true); + if (validate_arg (arg0, COMPLEX_TYPE) + && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE) + return do_mpc_arg1 (arg0, type, mpc_cosh); + break; CASE_FLT_FN (BUILT_IN_CPROJ): return fold_builtin_cproj (loc, arg0, type); @@ -9832,7 +9738,9 @@ fold_builtin_1 (location_t loc, tree fndecl, tree arg0) break; CASE_FLT_FN (BUILT_IN_COS): - return fold_builtin_cos (loc, arg0, type, fndecl); + if (validate_arg (arg0, REAL_TYPE)) + return do_mpfr_arg1 (arg0, type, mpfr_cos, NULL, NULL, 0); + break; CASE_FLT_FN (BUILT_IN_TAN): return fold_builtin_tan (arg0, type); @@ -9851,7 +9759,9 @@ fold_builtin_1 (location_t loc, tree fndecl, tree arg0) break; CASE_FLT_FN (BUILT_IN_COSH): - return fold_builtin_cosh (loc, arg0, type, fndecl); + if (validate_arg (arg0, REAL_TYPE)) + return do_mpfr_arg1 (arg0, type, mpfr_cosh, NULL, NULL, 0); + break; CASE_FLT_FN (BUILT_IN_TANH): if (validate_arg (arg0, REAL_TYPE)) @@ -10105,7 +10015,7 @@ fold_builtin_2 (location_t loc, tree fndecl, tree arg0, tree arg1) break; CASE_FLT_FN (BUILT_IN_HYPOT): - return fold_builtin_hypot (loc, fndecl, arg0, arg1, type); + return fold_builtin_hypot (loc, arg0, arg1, type); CASE_FLT_FN (BUILT_IN_CPOW): if (validate_arg (arg0, COMPLEX_TYPE) @@ -10161,7 +10071,7 @@ fold_builtin_2 (location_t loc, tree fndecl, tree arg0, tree arg1) return fold_builtin_powi (loc, fndecl, arg0, arg1, type); CASE_FLT_FN (BUILT_IN_COPYSIGN): - return fold_builtin_copysign (loc, fndecl, arg0, arg1, type); + return fold_builtin_copysign (loc, arg0, arg1, type); CASE_FLT_FN (BUILT_IN_FMIN): return fold_builtin_fmin_fmax (loc, arg0, arg1, type, /*max=*/false); diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 7f00e72..5e945de 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -7801,15 +7801,6 @@ fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0) TREE_TYPE (targ0), targ0)); } - - /* Strip sign ops from argument. */ - if (TREE_CODE (type) == REAL_TYPE) - { - tem = fold_strip_sign_ops (arg0); - if (tem) - return fold_build1_loc (loc, ABS_EXPR, type, - fold_convert_loc (loc, type, tem)); - } return NULL_TREE; case BIT_NOT_EXPR: @@ -9896,17 +9887,6 @@ fold_binary_loc (location_t loc, TREE_OPERAND (arg0, 1)); } - /* Strip sign operations from X in X*X, i.e. -Y*-Y -> Y*Y. */ - if (operand_equal_p (arg0, arg1, 0)) - { - tree tem = fold_strip_sign_ops (arg0); - if (tem != NULL_TREE) - { - tem = fold_convert_loc (loc, type, tem); - return fold_build2_loc (loc, MULT_EXPR, type, tem, tem); - } - } - /* Fold z * +-I to __complex__ (-+__imag z, +-__real z). This is not the same for NaNs or if signed zeros are involved. */ @@ -14312,82 +14292,6 @@ ptr_difference_const (tree e1, tree e2, HOST_WIDE_INT *diff) return true; } -/* Simplify the floating point expression EXP when the sign of the - result is not significant. Return NULL_TREE if no simplification - is possible. */ - -tree -fold_strip_sign_ops (tree exp) -{ - tree arg0, arg1; - location_t loc = EXPR_LOCATION (exp); - - switch (TREE_CODE (exp)) - { - case ABS_EXPR: - case NEGATE_EXPR: - arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0)); - return arg0 ? arg0 : TREE_OPERAND (exp, 0); - - case MULT_EXPR: - case RDIV_EXPR: - if (HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (exp))) - return NULL_TREE; - arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0)); - arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1)); - if (arg0 != NULL_TREE || arg1 != NULL_TREE) - return fold_build2_loc (loc, TREE_CODE (exp), TREE_TYPE (exp), - arg0 ? arg0 : TREE_OPERAND (exp, 0), - arg1 ? arg1 : TREE_OPERAND (exp, 1)); - break; - - case COMPOUND_EXPR: - arg0 = TREE_OPERAND (exp, 0); - arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1)); - if (arg1) - return fold_build2_loc (loc, COMPOUND_EXPR, TREE_TYPE (exp), arg0, arg1); - break; - - case COND_EXPR: - arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 1)); - arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 2)); - if (arg0 || arg1) - return fold_build3_loc (loc, - COND_EXPR, TREE_TYPE (exp), TREE_OPERAND (exp, 0), - arg0 ? arg0 : TREE_OPERAND (exp, 1), - arg1 ? arg1 : TREE_OPERAND (exp, 2)); - break; - - case CALL_EXPR: - { - const enum built_in_function fcode = builtin_mathfn_code (exp); - switch (fcode) - { - CASE_FLT_FN (BUILT_IN_COPYSIGN): - /* Strip copysign function call, return the 1st argument. */ - arg0 = CALL_EXPR_ARG (exp, 0); - arg1 = CALL_EXPR_ARG (exp, 1); - return omit_one_operand_loc (loc, TREE_TYPE (exp), arg0, arg1); - - default: - /* Strip sign ops from the argument of "odd" math functions. */ - if (negate_mathfn_p (fcode)) - { - arg0 = fold_strip_sign_ops (CALL_EXPR_ARG (exp, 0)); - if (arg0) - return build_call_expr_loc (loc, get_callee_fndecl (exp), 1, arg0); - } - break; - } - } - break; - - default: - break; - } - return NULL_TREE; -} - /* Return OFF converted to a pointer offset type suitable as offset for POINTER_PLUS_EXPR. Use location LOC for this conversion. */ tree diff --git a/gcc/fold-const.h b/gcc/fold-const.h index 4d5b24b..1bb68e4 100644 --- a/gcc/fold-const.h +++ b/gcc/fold-const.h @@ -107,7 +107,6 @@ extern tree build_fold_addr_expr_loc (location_t, tree); build_fold_addr_expr_with_type_loc (UNKNOWN_LOCATION, (T), TYPE) extern tree build_fold_addr_expr_with_type_loc (location_t, tree, tree); extern tree fold_build_cleanup_point_expr (tree type, tree expr); -extern tree fold_strip_sign_ops (tree); #define build_fold_indirect_ref(T)\ build_fold_indirect_ref_loc (UNKNOWN_LOCATION, T) extern tree build_fold_indirect_ref_loc (location_t, tree); diff --git a/gcc/testsuite/gcc.dg/builtins-86.c b/gcc/testsuite/gcc.dg/builtins-86.c index f405124..d0e5c70 100644 --- a/gcc/testsuite/gcc.dg/builtins-86.c +++ b/gcc/testsuite/gcc.dg/builtins-86.c @@ -53,4 +53,5 @@ int main() return 0; } -/* { dg-final { scan-tree-dump-times "link_error" 0 "optimized" } } */ +/* XFAILed because of PR 67975. */ +/* { dg-final { scan-tree-dump-times "link_error" 0 "optimized" { xfail *-*-* } } } */ diff --git a/gcc/testsuite/gcc.dg/torture/builtin-symmetric-1.c b/gcc/testsuite/gcc.dg/torture/builtin-symmetric-1.c index 4834d8e..61d8a80 100644 --- a/gcc/testsuite/gcc.dg/torture/builtin-symmetric-1.c +++ b/gcc/testsuite/gcc.dg/torture/builtin-symmetric-1.c @@ -7,6 +7,7 @@ /* { dg-do link } */ /* { dg-options "-ffast-math" } */ +/* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */ /* All references to link_error should go away at compile-time. */ extern void link_error(int);