From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8203 invoked by alias); 15 Apr 2011 20:21:20 -0000 Received: (qmail 8194 invoked by uid 22791); 15 Apr 2011 20:21:17 -0000 X-SWARE-Spam-Status: No, hits=-6.5 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,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; Fri, 15 Apr 2011 20:21:12 +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 p3FKLBtk009922 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 15 Apr 2011 16:21:11 -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 p3FKLA0Q029749 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 15 Apr 2011 16:21:11 -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 p3FKLAeA006255 for ; Fri, 15 Apr 2011 22:21:10 +0200 Received: (from jakub@localhost) by tyan-ft48-01.lab.bos.redhat.com (8.14.4/8.14.4/Submit) id p3FKLAEX006254 for gcc-patches@gcc.gnu.org; Fri, 15 Apr 2011 22:21:10 +0200 Date: Fri, 15 Apr 2011 20:27:00 -0000 From: Jakub Jelinek To: gcc-patches@gcc.gnu.org Subject: [PATCH] Prefer simplify_gen_* over gen_* in expand_debug_expr Message-ID: <20110415202109.GT17079@tyan-ft48-01.lab.bos.redhat.com> Reply-To: Jakub Jelinek MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2011-04/txt/msg01245.txt.bz2 Hi! On IRC richi mentioned yesterday that when gcc.dg/guality/asm-1.c testcase is compiled with g++ instead of gcc, it fails. Apparently that is because of slightly different ARRAY_REF in the code, which for g++ leads into (sign_extend:DI (zero_extend:SI (something:HI))) in DEBUG_INSN (as opposed to (zero_extend:DI (something:HI)) with C FE) and var-tracking doesn't happen to match it in some places. The above is something simplify-rtx.c can fix up though. This patch fixes it by using simplify_gen_* instead of gen_* in many more places than it did until now in expand_debug_expr. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2011-04-15 Jakub Jelinek * cfgexpand.c (expand_debug_expr): Use simplify_gen_{unary,binary,ternary} instead of gen_rtx_*. --- gcc/cfgexpand.c.jj 2011-04-09 19:29:19.081421040 +0200 +++ gcc/cfgexpand.c 2011-04-14 18:52:51.354402038 +0200 @@ -2364,6 +2364,7 @@ expand_debug_expr (tree exp) { rtx op0 = NULL_RTX, op1 = NULL_RTX, op2 = NULL_RTX; enum machine_mode mode = TYPE_MODE (TREE_TYPE (exp)); + enum machine_mode inner_mode = VOIDmode; int unsignedp = TYPE_UNSIGNED (TREE_TYPE (exp)); addr_space_t as; @@ -2410,6 +2411,7 @@ expand_debug_expr (tree exp) unary: case tcc_unary: + inner_mode = TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))); op0 = expand_debug_expr (TREE_OPERAND (exp, 0)); if (!op0) return NULL_RTX; @@ -2513,7 +2515,7 @@ expand_debug_expr (tree exp) case NOP_EXPR: case CONVERT_EXPR: { - enum machine_mode inner_mode = GET_MODE (op0); + inner_mode = GET_MODE (op0); if (mode == inner_mode) return op0; @@ -2560,9 +2562,9 @@ expand_debug_expr (tree exp) else if (TREE_CODE_CLASS (TREE_CODE (exp)) == tcc_unary ? TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))) : unsignedp) - op0 = gen_rtx_ZERO_EXTEND (mode, op0); + op0 = simplify_gen_unary (ZERO_EXTEND, mode, op0, inner_mode); else - op0 = gen_rtx_SIGN_EXTEND (mode, op0); + op0 = simplify_gen_unary (SIGN_EXTEND, mode, op0, inner_mode); return op0; } @@ -2697,7 +2699,8 @@ expand_debug_expr (tree exp) /* Don't use offset_address here, we don't need a recognizable address, and we don't want to generate code. */ - op0 = gen_rtx_MEM (mode, gen_rtx_PLUS (addrmode, op0, op1)); + op0 = gen_rtx_MEM (mode, simplify_gen_binary (PLUS, addrmode, + op0, op1)); } if (MEM_P (op0)) @@ -2770,25 +2773,23 @@ expand_debug_expr (tree exp) } case ABS_EXPR: - return gen_rtx_ABS (mode, op0); + return simplify_gen_unary (ABS, mode, op0, mode); case NEGATE_EXPR: - return gen_rtx_NEG (mode, op0); + return simplify_gen_unary (NEG, mode, op0, mode); case BIT_NOT_EXPR: - return gen_rtx_NOT (mode, op0); + return simplify_gen_unary (NOT, mode, op0, mode); case FLOAT_EXPR: - if (unsignedp) - return gen_rtx_UNSIGNED_FLOAT (mode, op0); - else - return gen_rtx_FLOAT (mode, op0); + return simplify_gen_unary (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, + 0))) + ? UNSIGNED_FLOAT : FLOAT, mode, op0, + inner_mode); case FIX_TRUNC_EXPR: - if (unsignedp) - return gen_rtx_UNSIGNED_FIX (mode, op0); - else - return gen_rtx_FIX (mode, op0); + return simplify_gen_unary (unsignedp ? UNSIGNED_FIX : FIX, mode, op0, + inner_mode); case POINTER_PLUS_EXPR: /* For the rare target where pointers are not the same size as @@ -2799,161 +2800,164 @@ expand_debug_expr (tree exp) && GET_MODE (op0) != GET_MODE (op1)) { if (GET_MODE_BITSIZE (GET_MODE (op0)) < GET_MODE_BITSIZE (GET_MODE (op1))) - op1 = gen_rtx_TRUNCATE (GET_MODE (op0), op1); + op1 = simplify_gen_unary (TRUNCATE, GET_MODE (op0), op1, + GET_MODE (op1)); else /* We always sign-extend, regardless of the signedness of the operand, because the operand is always unsigned here even if the original C expression is signed. */ - op1 = gen_rtx_SIGN_EXTEND (GET_MODE (op0), op1); + op1 = simplify_gen_unary (SIGN_EXTEND, GET_MODE (op0), op1, + GET_MODE (op1)); } /* Fall through. */ case PLUS_EXPR: - return gen_rtx_PLUS (mode, op0, op1); + return simplify_gen_binary (PLUS, mode, op0, op1); case MINUS_EXPR: - return gen_rtx_MINUS (mode, op0, op1); + return simplify_gen_binary (MINUS, mode, op0, op1); case MULT_EXPR: - return gen_rtx_MULT (mode, op0, op1); + return simplify_gen_binary (MULT, mode, op0, op1); case RDIV_EXPR: case TRUNC_DIV_EXPR: case EXACT_DIV_EXPR: if (unsignedp) - return gen_rtx_UDIV (mode, op0, op1); + return simplify_gen_binary (UDIV, mode, op0, op1); else - return gen_rtx_DIV (mode, op0, op1); + return simplify_gen_binary (DIV, mode, op0, op1); case TRUNC_MOD_EXPR: - if (unsignedp) - return gen_rtx_UMOD (mode, op0, op1); - else - return gen_rtx_MOD (mode, op0, op1); + return simplify_gen_binary (unsignedp ? UMOD : MOD, mode, op0, op1); case FLOOR_DIV_EXPR: if (unsignedp) - return gen_rtx_UDIV (mode, op0, op1); + return simplify_gen_binary (UDIV, mode, op0, op1); else { - rtx div = gen_rtx_DIV (mode, op0, op1); - rtx mod = gen_rtx_MOD (mode, op0, op1); + rtx div = simplify_gen_binary (DIV, mode, op0, op1); + rtx mod = simplify_gen_binary (MOD, mode, op0, op1); rtx adj = floor_sdiv_adjust (mode, mod, op1); - return gen_rtx_PLUS (mode, div, adj); + return simplify_gen_binary (PLUS, mode, div, adj); } case FLOOR_MOD_EXPR: if (unsignedp) - return gen_rtx_UMOD (mode, op0, op1); + return simplify_gen_binary (UMOD, mode, op0, op1); else { - rtx mod = gen_rtx_MOD (mode, op0, op1); + rtx mod = simplify_gen_binary (MOD, mode, op0, op1); rtx adj = floor_sdiv_adjust (mode, mod, op1); - adj = gen_rtx_NEG (mode, gen_rtx_MULT (mode, adj, op1)); - return gen_rtx_PLUS (mode, mod, adj); + adj = simplify_gen_unary (NEG, mode, + simplify_gen_binary (MULT, mode, adj, op1), + mode); + return simplify_gen_binary (PLUS, mode, mod, adj); } case CEIL_DIV_EXPR: if (unsignedp) { - rtx div = gen_rtx_UDIV (mode, op0, op1); - rtx mod = gen_rtx_UMOD (mode, op0, op1); + rtx div = simplify_gen_binary (UDIV, mode, op0, op1); + rtx mod = simplify_gen_binary (UMOD, mode, op0, op1); rtx adj = ceil_udiv_adjust (mode, mod, op1); - return gen_rtx_PLUS (mode, div, adj); + return simplify_gen_binary (PLUS, mode, div, adj); } else { - rtx div = gen_rtx_DIV (mode, op0, op1); - rtx mod = gen_rtx_MOD (mode, op0, op1); + rtx div = simplify_gen_binary (DIV, mode, op0, op1); + rtx mod = simplify_gen_binary (MOD, mode, op0, op1); rtx adj = ceil_sdiv_adjust (mode, mod, op1); - return gen_rtx_PLUS (mode, div, adj); + return simplify_gen_binary (PLUS, mode, div, adj); } case CEIL_MOD_EXPR: if (unsignedp) { - rtx mod = gen_rtx_UMOD (mode, op0, op1); + rtx mod = simplify_gen_binary (UMOD, mode, op0, op1); rtx adj = ceil_udiv_adjust (mode, mod, op1); - adj = gen_rtx_NEG (mode, gen_rtx_MULT (mode, adj, op1)); - return gen_rtx_PLUS (mode, mod, adj); + adj = simplify_gen_unary (NEG, mode, + simplify_gen_binary (MULT, mode, adj, op1), + mode); + return simplify_gen_binary (PLUS, mode, mod, adj); } else { - rtx mod = gen_rtx_MOD (mode, op0, op1); + rtx mod = simplify_gen_binary (MOD, mode, op0, op1); rtx adj = ceil_sdiv_adjust (mode, mod, op1); - adj = gen_rtx_NEG (mode, gen_rtx_MULT (mode, adj, op1)); - return gen_rtx_PLUS (mode, mod, adj); + adj = simplify_gen_unary (NEG, mode, + simplify_gen_binary (MULT, mode, adj, op1), + mode); + return simplify_gen_binary (PLUS, mode, mod, adj); } case ROUND_DIV_EXPR: if (unsignedp) { - rtx div = gen_rtx_UDIV (mode, op0, op1); - rtx mod = gen_rtx_UMOD (mode, op0, op1); + rtx div = simplify_gen_binary (UDIV, mode, op0, op1); + rtx mod = simplify_gen_binary (UMOD, mode, op0, op1); rtx adj = round_udiv_adjust (mode, mod, op1); - return gen_rtx_PLUS (mode, div, adj); + return simplify_gen_binary (PLUS, mode, div, adj); } else { - rtx div = gen_rtx_DIV (mode, op0, op1); - rtx mod = gen_rtx_MOD (mode, op0, op1); + rtx div = simplify_gen_binary (DIV, mode, op0, op1); + rtx mod = simplify_gen_binary (MOD, mode, op0, op1); rtx adj = round_sdiv_adjust (mode, mod, op1); - return gen_rtx_PLUS (mode, div, adj); + return simplify_gen_binary (PLUS, mode, div, adj); } case ROUND_MOD_EXPR: if (unsignedp) { - rtx mod = gen_rtx_UMOD (mode, op0, op1); + rtx mod = simplify_gen_binary (UMOD, mode, op0, op1); rtx adj = round_udiv_adjust (mode, mod, op1); - adj = gen_rtx_NEG (mode, gen_rtx_MULT (mode, adj, op1)); - return gen_rtx_PLUS (mode, mod, adj); + adj = simplify_gen_unary (NEG, mode, + simplify_gen_binary (MULT, mode, adj, op1), + mode); + return simplify_gen_binary (PLUS, mode, mod, adj); } else { - rtx mod = gen_rtx_MOD (mode, op0, op1); + rtx mod = simplify_gen_binary (MOD, mode, op0, op1); rtx adj = round_sdiv_adjust (mode, mod, op1); - adj = gen_rtx_NEG (mode, gen_rtx_MULT (mode, adj, op1)); - return gen_rtx_PLUS (mode, mod, adj); + adj = simplify_gen_unary (NEG, mode, + simplify_gen_binary (MULT, mode, adj, op1), + mode); + return simplify_gen_binary (PLUS, mode, mod, adj); } case LSHIFT_EXPR: - return gen_rtx_ASHIFT (mode, op0, op1); + return simplify_gen_binary (ASHIFT, mode, op0, op1); case RSHIFT_EXPR: if (unsignedp) - return gen_rtx_LSHIFTRT (mode, op0, op1); + return simplify_gen_binary (LSHIFTRT, mode, op0, op1); else - return gen_rtx_ASHIFTRT (mode, op0, op1); + return simplify_gen_binary (ASHIFTRT, mode, op0, op1); case LROTATE_EXPR: - return gen_rtx_ROTATE (mode, op0, op1); + return simplify_gen_binary (ROTATE, mode, op0, op1); case RROTATE_EXPR: - return gen_rtx_ROTATERT (mode, op0, op1); + return simplify_gen_binary (ROTATERT, mode, op0, op1); case MIN_EXPR: - if (unsignedp) - return gen_rtx_UMIN (mode, op0, op1); - else - return gen_rtx_SMIN (mode, op0, op1); + return simplify_gen_binary (unsignedp ? UMIN : SMIN, mode, op0, op1); case MAX_EXPR: - if (unsignedp) - return gen_rtx_UMAX (mode, op0, op1); - else - return gen_rtx_SMAX (mode, op0, op1); + return simplify_gen_binary (unsignedp ? UMAX : SMAX, mode, op0, op1); case BIT_AND_EXPR: case TRUTH_AND_EXPR: - return gen_rtx_AND (mode, op0, op1); + return simplify_gen_binary (AND, mode, op0, op1); case BIT_IOR_EXPR: case TRUTH_OR_EXPR: - return gen_rtx_IOR (mode, op0, op1); + return simplify_gen_binary (IOR, mode, op0, op1); case BIT_XOR_EXPR: case TRUTH_XOR_EXPR: - return gen_rtx_XOR (mode, op0, op1); + return simplify_gen_binary (XOR, mode, op0, op1); case TRUTH_ANDIF_EXPR: return gen_rtx_IF_THEN_ELSE (mode, op0, op1, const0_rtx); @@ -2962,61 +2966,53 @@ expand_debug_expr (tree exp) return gen_rtx_IF_THEN_ELSE (mode, op0, const_true_rtx, op1); case TRUTH_NOT_EXPR: - return gen_rtx_EQ (mode, op0, const0_rtx); + return simplify_gen_relational (EQ, mode, inner_mode, op0, const0_rtx); case LT_EXPR: - if (unsignedp) - return gen_rtx_LTU (mode, op0, op1); - else - return gen_rtx_LT (mode, op0, op1); + return simplify_gen_relational (unsignedp ? LTU : LT, mode, inner_mode, + op0, op1); case LE_EXPR: - if (unsignedp) - return gen_rtx_LEU (mode, op0, op1); - else - return gen_rtx_LE (mode, op0, op1); + return simplify_gen_relational (unsignedp ? LEU : LE, mode, inner_mode, + op0, op1); case GT_EXPR: - if (unsignedp) - return gen_rtx_GTU (mode, op0, op1); - else - return gen_rtx_GT (mode, op0, op1); + return simplify_gen_relational (unsignedp ? GTU : GT, mode, inner_mode, + op0, op1); case GE_EXPR: - if (unsignedp) - return gen_rtx_GEU (mode, op0, op1); - else - return gen_rtx_GE (mode, op0, op1); + return simplify_gen_relational (unsignedp ? GEU : GE, mode, inner_mode, + op0, op1); case EQ_EXPR: - return gen_rtx_EQ (mode, op0, op1); + return simplify_gen_relational (EQ, mode, inner_mode, op0, op1); case NE_EXPR: - return gen_rtx_NE (mode, op0, op1); + return simplify_gen_relational (NE, mode, inner_mode, op0, op1); case UNORDERED_EXPR: - return gen_rtx_UNORDERED (mode, op0, op1); + return simplify_gen_relational (UNORDERED, mode, inner_mode, op0, op1); case ORDERED_EXPR: - return gen_rtx_ORDERED (mode, op0, op1); + return simplify_gen_relational (ORDERED, mode, inner_mode, op0, op1); case UNLT_EXPR: - return gen_rtx_UNLT (mode, op0, op1); + return simplify_gen_relational (UNLT, mode, inner_mode, op0, op1); case UNLE_EXPR: - return gen_rtx_UNLE (mode, op0, op1); + return simplify_gen_relational (UNLE, mode, inner_mode, op0, op1); case UNGT_EXPR: - return gen_rtx_UNGT (mode, op0, op1); + return simplify_gen_relational (UNGT, mode, inner_mode, op0, op1); case UNGE_EXPR: - return gen_rtx_UNGE (mode, op0, op1); + return simplify_gen_relational (UNGE, mode, inner_mode, op0, op1); case UNEQ_EXPR: - return gen_rtx_UNEQ (mode, op0, op1); + return simplify_gen_relational (UNEQ, mode, inner_mode, op0, op1); case LTGT_EXPR: - return gen_rtx_LTGT (mode, op0, op1); + return simplify_gen_relational (LTGT, mode, inner_mode, op0, op1); case COND_EXPR: return gen_rtx_IF_THEN_ELSE (mode, op0, op1, op2); @@ -3032,8 +3028,9 @@ expand_debug_expr (tree exp) case CONJ_EXPR: if (GET_CODE (op0) == CONCAT) return gen_rtx_CONCAT (mode, XEXP (op0, 0), - gen_rtx_NEG (GET_MODE_INNER (mode), - XEXP (op0, 1))); + simplify_gen_unary (NEG, GET_MODE_INNER (mode), + XEXP (op0, 1), + GET_MODE_INNER (mode))); else { enum machine_mode imode = GET_MODE_INNER (mode); @@ -3233,16 +3230,18 @@ expand_debug_expr (tree exp) if (SCALAR_INT_MODE_P (GET_MODE (op0)) && SCALAR_INT_MODE_P (mode)) { - if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0)))) - op0 = gen_rtx_ZERO_EXTEND (mode, op0); - else - op0 = gen_rtx_SIGN_EXTEND (mode, op0); - if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 1)))) - op1 = gen_rtx_ZERO_EXTEND (mode, op1); - else - op1 = gen_rtx_SIGN_EXTEND (mode, op1); - op0 = gen_rtx_MULT (mode, op0, op1); - return gen_rtx_PLUS (mode, op0, op2); + op0 + = simplify_gen_unary (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, + 0))) + ? ZERO_EXTEND : SIGN_EXTEND, mode, op0, + inner_mode); + op1 + = simplify_gen_unary (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, + 1))) + ? ZERO_EXTEND : SIGN_EXTEND, mode, op1, + inner_mode); + op0 = simplify_gen_binary (MULT, mode, op0, op1); + return simplify_gen_binary (PLUS, mode, op0, op2); } return NULL; @@ -3252,7 +3251,7 @@ expand_debug_expr (tree exp) if (SCALAR_INT_MODE_P (GET_MODE (op0)) && SCALAR_INT_MODE_P (mode)) { - enum machine_mode inner_mode = GET_MODE (op0); + inner_mode = GET_MODE (op0); if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0)))) op0 = simplify_gen_unary (ZERO_EXTEND, mode, op0, inner_mode); else @@ -3261,13 +3260,13 @@ expand_debug_expr (tree exp) op1 = simplify_gen_unary (ZERO_EXTEND, mode, op1, inner_mode); else op1 = simplify_gen_unary (SIGN_EXTEND, mode, op1, inner_mode); - op0 = gen_rtx_MULT (mode, op0, op1); + op0 = simplify_gen_binary (MULT, mode, op0, op1); if (TREE_CODE (exp) == WIDEN_MULT_EXPR) return op0; else if (TREE_CODE (exp) == WIDEN_MULT_PLUS_EXPR) - return gen_rtx_PLUS (mode, op0, op2); + return simplify_gen_binary (PLUS, mode, op0, op2); else - return gen_rtx_MINUS (mode, op2, op0); + return simplify_gen_binary (MINUS, mode, op2, op0); } return NULL; @@ -3275,16 +3274,17 @@ expand_debug_expr (tree exp) if (SCALAR_INT_MODE_P (GET_MODE (op0)) && SCALAR_INT_MODE_P (mode)) { - if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0)))) - op0 = gen_rtx_ZERO_EXTEND (mode, op0); - else - op0 = gen_rtx_SIGN_EXTEND (mode, op0); - return gen_rtx_PLUS (mode, op0, op1); + op0 + = simplify_gen_unary (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, + 0))) + ? ZERO_EXTEND : SIGN_EXTEND, mode, op0, + inner_mode); + return simplify_gen_binary (PLUS, mode, op0, op1); } return NULL; case FMA_EXPR: - return gen_rtx_FMA (mode, op0, op1, op2); + return simplify_gen_ternary (FMA, mode, inner_mode, op0, op1, op2); default: flag_unsupported: Jakub