diff mbox

Prefer simplify_gen_* over gen_* in expand_debug_expr

Message ID 20110415202109.GT17079@tyan-ft48-01.lab.bos.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek April 15, 2011, 8:21 p.m. UTC
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  <jakub@redhat.com>

	* cfgexpand.c (expand_debug_expr): Use
	simplify_gen_{unary,binary,ternary} instead of gen_rtx_*.


	Jakub

Comments

Richard Biener April 15, 2011, 8:27 p.m. UTC | #1
On Fri, Apr 15, 2011 at 10:21 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> 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?

Ok.

Thanks,
Richard.

> 2011-04-15  Jakub Jelinek  <jakub@redhat.com>
>
>        * 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
>
diff mbox

Patch

--- 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: