OSDN Git Service

* expr.c (expand_expr_real_1): New local treeop0, treeop1,
authormatz <matz@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 25 Aug 2009 13:31:56 +0000 (13:31 +0000)
committermatz <matz@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 25 Aug 2009 13:31:56 +0000 (13:31 +0000)
        treeop2 initialized with first three operands of the full expression.
        Substitute all TREE_OPERAND (exp, [012]) calls with them.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@151078 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/expr.c

index 1a3905e..bb5e0b1 100644 (file)
@@ -1,3 +1,9 @@
+2009-08-25  Michael Matz  <matz@suse.de>
+
+       * expr.c (expand_expr_real_1): New local treeop0, treeop1,
+       treeop2 initialized with first three operands of the full expression.
+       Substitute all TREE_OPERAND (exp, [012]) calls with them.
+
 2009-08-25  Kai Tietz  <kai.tietz@onevision.com>
 
        * gcc/gthr-win32.h (__UNUSED_PARAM): Define, if not already present.
index 6805cdc..7e316b5 100644 (file)
@@ -7220,6 +7220,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
   gimple subexp0_def, subexp1_def;
   tree top0, top1;
   location_t loc = EXPR_LOCATION (exp);
+  tree treeop0, treeop1, treeop2;
 #define REDUCE_BIT_FIELD(expr) (reduce_bit_field                         \
                                 ? reduce_to_bit_field_precision ((expr), \
                                                                  target, \
@@ -7230,6 +7231,17 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
   mode = TYPE_MODE (type);
   unsignedp = TYPE_UNSIGNED (type);
 
+  treeop0 = treeop1 = treeop2 = NULL_TREE;
+  if (!VL_EXP_CLASS_P (exp))
+    switch (TREE_CODE_LENGTH (code))
+      {
+       default:
+       case 3: treeop2 = TREE_OPERAND (exp, 2);
+       case 2: treeop1 = TREE_OPERAND (exp, 1);
+       case 1: treeop0 = TREE_OPERAND (exp, 0);
+       case 0: break;
+      }
+
   ignore = (target == const0_rtx
            || ((CONVERT_EXPR_CODE_P (code)
                 || code == COND_EXPR || code == VIEW_CONVERT_EXPR)
@@ -7268,22 +7280,22 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
 
       if (TREE_CODE_CLASS (code) == tcc_unary
          || code == COMPONENT_REF || code == INDIRECT_REF)
-       return expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode,
+       return expand_expr (treeop0, const0_rtx, VOIDmode,
                            modifier);
 
       else if (TREE_CODE_CLASS (code) == tcc_binary
               || TREE_CODE_CLASS (code) == tcc_comparison
               || code == ARRAY_REF || code == ARRAY_RANGE_REF)
        {
-         expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, modifier);
-         expand_expr (TREE_OPERAND (exp, 1), const0_rtx, VOIDmode, modifier);
+         expand_expr (treeop0, const0_rtx, VOIDmode, modifier);
+         expand_expr (treeop1, const0_rtx, VOIDmode, modifier);
          return const0_rtx;
        }
       else if (code == BIT_FIELD_REF)
        {
-         expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, modifier);
-         expand_expr (TREE_OPERAND (exp, 1), const0_rtx, VOIDmode, modifier);
-         expand_expr (TREE_OPERAND (exp, 2), const0_rtx, VOIDmode, modifier);
+         expand_expr (treeop0, const0_rtx, VOIDmode, modifier);
+         expand_expr (treeop1, const0_rtx, VOIDmode, modifier);
+         expand_expr (treeop2, const0_rtx, VOIDmode, modifier);
          return const0_rtx;
        }
 
@@ -7524,7 +7536,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
 
     case SAVE_EXPR:
       {
-       tree val = TREE_OPERAND (exp, 0);
+       tree val = treeop0;
        rtx ret = expand_expr_real_1 (val, target, tmode, modifier, alt_rtl);
 
        if (!SAVE_EXPR_RESOLVED_P (exp))
@@ -7539,7 +7551,8 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
                              VAR_DECL, NULL, TREE_TYPE (exp));
            DECL_ARTIFICIAL (val) = 1;
            DECL_IGNORED_P (val) = 1;
-           TREE_OPERAND (exp, 0) = val;
+           treeop0 = val;
+           TREE_OPERAND (exp, 0) = treeop0;
            SAVE_EXPR_RESOLVED_P (exp) = 1;
 
            if (!CONSTANT_P (ret))
@@ -7551,10 +7564,10 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
       }
 
     case GOTO_EXPR:
-      if (TREE_CODE (TREE_OPERAND (exp, 0)) == LABEL_DECL)
-       expand_goto (TREE_OPERAND (exp, 0));
+      if (TREE_CODE (treeop0) == LABEL_DECL)
+       expand_goto (treeop0);
       else
-       expand_computed_goto (TREE_OPERAND (exp, 0));
+       expand_computed_goto (treeop0);
       return const0_rtx;
 
     case CONSTRUCTOR:
@@ -7577,7 +7590,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
     case ALIGN_INDIRECT_REF:
     case INDIRECT_REF:
       {
-       tree exp1 = TREE_OPERAND (exp, 0);
+       tree exp1 = treeop0;
 
        if (modifier != EXPAND_WRITE)
          {
@@ -7645,8 +7658,8 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
     case ARRAY_REF:
 
       {
-       tree array = TREE_OPERAND (exp, 0);
-       tree index = TREE_OPERAND (exp, 1);
+       tree array = treeop0;
+       tree index = treeop1;
 
        /* Fold an expression like: "foo"[2].
           This is not done in fold so it won't happen inside &.
@@ -7736,7 +7749,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
                    tree index1 = index;
                    tree low_bound = array_ref_low_bound (exp);
                    index1 = fold_convert_loc (loc, sizetype,
-                                              TREE_OPERAND (exp, 1));
+                                              treeop1);
 
                    /* Optimize the special-case of a zero lower bound.
 
@@ -7772,14 +7785,14 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
     case COMPONENT_REF:
       /* If the operand is a CONSTRUCTOR, we can just extract the
         appropriate field if it is present.  */
-      if (TREE_CODE (TREE_OPERAND (exp, 0)) == CONSTRUCTOR)
+      if (TREE_CODE (treeop0) == CONSTRUCTOR)
        {
          unsigned HOST_WIDE_INT idx;
          tree field, value;
 
-         FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (TREE_OPERAND (exp, 0)),
+         FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (treeop0),
                                    idx, field, value)
-           if (field == TREE_OPERAND (exp, 1)
+           if (field == treeop1
                /* We can normally use the value of the field in the
                   CONSTRUCTOR.  However, if this is a bitfield in
                   an integral mode that we can fit in a HOST_WIDE_INT,
@@ -8159,18 +8172,18 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
 
     case PAREN_EXPR:
     CASE_CONVERT:
-      if (TREE_OPERAND (exp, 0) == error_mark_node)
+      if (treeop0 == error_mark_node)
        return const0_rtx;
 
       if (TREE_CODE (type) == UNION_TYPE)
        {
-         tree valtype = TREE_TYPE (TREE_OPERAND (exp, 0));
+         tree valtype = TREE_TYPE (treeop0);
 
          /* If both input and output are BLKmode, this conversion isn't doing
             anything except possibly changing memory attribute.  */
          if (mode == BLKmode && TYPE_MODE (valtype) == BLKmode)
            {
-             rtx result = expand_expr (TREE_OPERAND (exp, 0), target, tmode,
+             rtx result = expand_expr (treeop0, target, tmode,
                                        modifier);
 
              result = copy_rtx (result);
@@ -8188,7 +8201,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
 
          if (MEM_P (target))
            /* Store data into beginning of memory target.  */
-           store_expr (TREE_OPERAND (exp, 0),
+           store_expr (treeop0,
                        adjust_address (target, TYPE_MODE (valtype), 0),
                        modifier == EXPAND_STACK_PARM,
                        false);
@@ -8200,10 +8213,10 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
              /* Store this field into a union of the proper type.  */
              store_field (target,
                           MIN ((int_size_in_bytes (TREE_TYPE
-                                                   (TREE_OPERAND (exp, 0)))
+                                                   (treeop0))
                                 * BITS_PER_UNIT),
                                (HOST_WIDE_INT) GET_MODE_BITSIZE (mode)),
-                          0, TYPE_MODE (valtype), TREE_OPERAND (exp, 0),
+                          0, TYPE_MODE (valtype), treeop0,
                           type, 0, false);
            }
 
@@ -8211,22 +8224,22 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
          return target;
        }
 
-      if (mode == TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))))
+      if (mode == TYPE_MODE (TREE_TYPE (treeop0)))
        {
-         op0 = expand_expr (TREE_OPERAND (exp, 0), target, VOIDmode,
+         op0 = expand_expr (treeop0, target, VOIDmode,
                             modifier);
 
          /* If the signedness of the conversion differs and OP0 is
             a promoted SUBREG, clear that indication since we now
             have to do the proper extension.  */
-         if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))) != unsignedp
+         if (TYPE_UNSIGNED (TREE_TYPE (treeop0)) != unsignedp
              && GET_CODE (op0) == SUBREG)
            SUBREG_PROMOTED_VAR_P (op0) = 0;
 
          return REDUCE_BIT_FIELD (op0);
        }
 
-      op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, mode,
+      op0 = expand_expr (treeop0, NULL_RTX, mode,
                         modifier == EXPAND_SUM ? EXPAND_NORMAL : modifier);
       if (GET_MODE (op0) == mode)
        ;
@@ -8234,7 +8247,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
       /* If OP0 is a constant, just convert it into the proper mode.  */
       else if (CONSTANT_P (op0))
        {
-         tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
+         tree inner_type = TREE_TYPE (treeop0);
          enum machine_mode inner_mode = TYPE_MODE (inner_type);
 
          if (modifier == EXPAND_INITIALIZER)
@@ -8252,11 +8265,11 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
       else if (target == 0)
        op0 = convert_to_mode (mode, op0,
                               TYPE_UNSIGNED (TREE_TYPE
-                                             (TREE_OPERAND (exp, 0))));
+                                             (treeop0)));
       else
        {
          convert_move (target, op0,
-                       TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))));
+                       TYPE_UNSIGNED (TREE_TYPE (treeop0)));
          op0 = target;
        }
 
@@ -8269,8 +8282,8 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
         temporary by fetching an inner memory reference.  */
       if (mode == BLKmode
          && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) == INTEGER_CST
-         && TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))) != BLKmode
-         && handled_component_p (TREE_OPERAND (exp, 0)))
+         && TYPE_MODE (TREE_TYPE (treeop0)) != BLKmode
+         && handled_component_p (treeop0))
       {
        enum machine_mode mode1;
        HOST_WIDE_INT bitsize, bitpos;
@@ -8278,7 +8291,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
        int unsignedp;
        int volatilep = 0;
        tree tem
-         = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, &bitpos,
+         = get_inner_reference (treeop0, &bitsize, &bitpos,
                                 &offset, &mode1, &unsignedp, &volatilep,
                                 true);
        rtx orig_op0;
@@ -8318,7 +8331,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
                if (op0 == orig_op0)
                  op0 = copy_rtx (op0);
 
-               set_mem_attributes (op0, TREE_OPERAND (exp, 0), 0);
+               set_mem_attributes (op0, treeop0, 0);
                if (REG_P (XEXP (op0, 0)))
                  mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0));
 
@@ -8328,7 +8341,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
       }
 
       if (!op0)
-       op0 = expand_expr (TREE_OPERAND (exp, 0),
+       op0 = expand_expr (treeop0,
                           NULL_RTX, VOIDmode, modifier);
 
       /* If the input and output modes are both the same, we are done.  */
@@ -8348,7 +8361,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
         other.  */
       else if (SCALAR_INT_MODE_P (GET_MODE (op0)) && SCALAR_INT_MODE_P (mode))
        op0 = convert_modes (mode, GET_MODE (op0), op0, 
-                            TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))));
+                            TYPE_UNSIGNED (TREE_TYPE (treeop0)));
       /* As a last resort, spill op0 to memory, and reload it in a
         different mode.  */
       else if (!MEM_P (op0))
@@ -8357,7 +8370,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
             are going to be changing the mode of the MEM, don't call
             force_const_mem for constants because we don't allow pool
             constants to change mode.  */
-         tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
+         tree inner_type = TREE_TYPE (treeop0);
 
          gcc_assert (!TREE_ADDRESSABLE (exp));
 
@@ -8385,7 +8398,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
                   && mode != BLKmode
                   && MEM_ALIGN (op0) < GET_MODE_ALIGNMENT (mode))
            {
-             tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
+             tree inner_type = TREE_TYPE (treeop0);
              HOST_WIDE_INT temp_size
                = MAX (int_size_in_bytes (inner_type),
                       (HOST_WIDE_INT) GET_MODE_SIZE (mode));
@@ -8419,18 +8432,15 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
       /* Make sure to sign-extend the sizetype offset in a POINTER_PLUS_EXPR
          if sizetype precision is smaller than pointer precision.  */
       if (TYPE_PRECISION (sizetype) < TYPE_PRECISION (type))
-       exp
-         = build2 (PLUS_EXPR, type,
-                   TREE_OPERAND (exp, 0),
-                   fold_convert_loc (loc, type,
-                                     fold_convert_loc (loc, ssizetype,
-                                                       TREE_OPERAND (exp, 1))));
+       treeop1 = fold_convert_loc (loc, type,
+                                   fold_convert_loc (loc, ssizetype,
+                                                     treeop1));
     case PLUS_EXPR:
 
       /* Check if this is a case for multiplication and addition.  */
       if ((TREE_CODE (type) == INTEGER_TYPE
           || TREE_CODE (type) == FIXED_POINT_TYPE)
-         && (subexp0_def = get_def_for_expr (TREE_OPERAND (exp, 0),
+         && (subexp0_def = get_def_for_expr (treeop0,
                                              MULT_EXPR)))
        {
          tree subsubexp0, subsubexp1;
@@ -8468,7 +8478,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
                {
                  expand_operands (top0, top1, NULL_RTX, &op0, &op1,
                                   EXPAND_NORMAL);
-                 op2 = expand_expr (TREE_OPERAND (exp, 1), subtarget,
+                 op2 = expand_expr (treeop1, subtarget,
                                     VOIDmode, EXPAND_NORMAL);
                  temp = expand_ternary_op (mode, this_optab, op0, op1, op2,
                                            target, unsignedp);
@@ -8489,17 +8499,17 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
         sp, ap, or fp is our second argument, in which case we must swap
         the innermost first argument and our second argument.  */
 
-      if (TREE_CODE (TREE_OPERAND (exp, 0)) == PLUS_EXPR
-         && TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 1)) == INTEGER_CST
-         && TREE_CODE (TREE_OPERAND (exp, 1)) == VAR_DECL
-         && (DECL_RTL (TREE_OPERAND (exp, 1)) == frame_pointer_rtx
-             || DECL_RTL (TREE_OPERAND (exp, 1)) == stack_pointer_rtx
-             || DECL_RTL (TREE_OPERAND (exp, 1)) == arg_pointer_rtx))
+      if (TREE_CODE (treeop0) == PLUS_EXPR
+         && TREE_CODE (TREE_OPERAND (treeop0, 1)) == INTEGER_CST
+         && TREE_CODE (treeop1) == VAR_DECL
+         && (DECL_RTL (treeop1) == frame_pointer_rtx
+             || DECL_RTL (treeop1) == stack_pointer_rtx
+             || DECL_RTL (treeop1) == arg_pointer_rtx))
        {
-         tree t = TREE_OPERAND (exp, 1);
+         tree t = treeop1;
 
-         TREE_OPERAND (exp, 1) = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
-         TREE_OPERAND (TREE_OPERAND (exp, 0), 0) = t;
+         treeop1 = TREE_OPERAND (treeop0, 0);
+         TREE_OPERAND (treeop0, 0) = t;
        }
 
       /* If the result is to be ptr_mode and we are adding an integer to
@@ -8515,40 +8525,40 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
        {
          if (modifier == EXPAND_STACK_PARM)
            target = 0;
-         if (TREE_CODE (TREE_OPERAND (exp, 0)) == INTEGER_CST
+         if (TREE_CODE (treeop0) == INTEGER_CST
              && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
-             && TREE_CONSTANT (TREE_OPERAND (exp, 1)))
+             && TREE_CONSTANT (treeop1))
            {
              rtx constant_part;
 
-             op1 = expand_expr (TREE_OPERAND (exp, 1), subtarget, VOIDmode,
+             op1 = expand_expr (treeop1, subtarget, VOIDmode,
                                 EXPAND_SUM);
              /* Use immed_double_const to ensure that the constant is
                 truncated according to the mode of OP1, then sign extended
                 to a HOST_WIDE_INT.  Using the constant directly can result
                 in non-canonical RTL in a 64x32 cross compile.  */
              constant_part
-               = immed_double_const (TREE_INT_CST_LOW (TREE_OPERAND (exp, 0)),
+               = immed_double_const (TREE_INT_CST_LOW (treeop0),
                                      (HOST_WIDE_INT) 0,
-                                     TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 1))));
+                                     TYPE_MODE (TREE_TYPE (treeop1)));
              op1 = plus_constant (op1, INTVAL (constant_part));
              if (modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
                op1 = force_operand (op1, target);
              return REDUCE_BIT_FIELD (op1);
            }
 
-         else if (TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST
+         else if (TREE_CODE (treeop1) == INTEGER_CST
                   && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
-                  && TREE_CONSTANT (TREE_OPERAND (exp, 0)))
+                  && TREE_CONSTANT (treeop0))
            {
              rtx constant_part;
 
-             op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode,
+             op0 = expand_expr (treeop0, subtarget, VOIDmode,
                                 (modifier == EXPAND_INITIALIZER
                                 ? EXPAND_INITIALIZER : EXPAND_SUM));
              if (! CONSTANT_P (op0))
                {
-                 op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX,
+                 op1 = expand_expr (treeop1, NULL_RTX,
                                     VOIDmode, modifier);
                  /* Return a PLUS if modifier says it's OK.  */
                  if (modifier == EXPAND_SUM
@@ -8561,9 +8571,9 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
                 to a HOST_WIDE_INT.  Using the constant directly can result
                 in non-canonical RTL in a 64x32 cross compile.  */
              constant_part
-               = immed_double_const (TREE_INT_CST_LOW (TREE_OPERAND (exp, 1)),
+               = immed_double_const (TREE_INT_CST_LOW (treeop1),
                                      (HOST_WIDE_INT) 0,
-                                     TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))));
+                                     TYPE_MODE (TREE_TYPE (treeop0)));
              op0 = plus_constant (op0, INTVAL (constant_part));
              if (modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
                op0 = force_operand (op0, target);
@@ -8578,7 +8588,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
       if ((modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
          || mode != ptr_mode)
        {
-         expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
+         expand_operands (treeop0, treeop1,
                           subtarget, &op0, &op1, EXPAND_NORMAL);
          if (op0 == const0_rtx)
            return op1;
@@ -8587,7 +8597,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
          goto binop2;
        }
 
-      expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
+      expand_operands (treeop0, treeop1,
                       subtarget, &op0, &op1, modifier);
       return REDUCE_BIT_FIELD (simplify_gen_binary (PLUS, mode, op0, op1));
 
@@ -8595,7 +8605,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
       /* Check if this is a case for multiplication and subtraction.  */
       if ((TREE_CODE (type) == INTEGER_TYPE
           || TREE_CODE (type) == FIXED_POINT_TYPE)
-         && (subexp1_def = get_def_for_expr (TREE_OPERAND (exp, 1),
+         && (subexp1_def = get_def_for_expr (treeop1,
                                              MULT_EXPR)))
        {
          tree subsubexp0, subsubexp1;
@@ -8633,7 +8643,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
                {
                  expand_operands (top0, top1, NULL_RTX, &op0, &op1,
                                   EXPAND_NORMAL);
-                 op2 = expand_expr (TREE_OPERAND (exp, 0), subtarget,
+                 op2 = expand_expr (treeop0, subtarget,
                                     VOIDmode, EXPAND_NORMAL);
                  temp = expand_ternary_op (mode, this_optab, op0, op1, op2,
                                            target, unsignedp);
@@ -8649,10 +8659,10 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
       /* Handle difference of two symbolic constants,
         for the sake of an initializer.  */
       if ((modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER)
-         && really_constant_p (TREE_OPERAND (exp, 0))
-         && really_constant_p (TREE_OPERAND (exp, 1)))
+         && really_constant_p (treeop0)
+         && really_constant_p (treeop1))
        {
-         expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
+         expand_operands (treeop0, treeop1,
                           NULL_RTX, &op0, &op1, modifier);
 
          /* If the last operand is a CONST_INT, use plus_constant of
@@ -8671,7 +8681,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
          || mode != ptr_mode)
        goto binop;
 
-      expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
+      expand_operands (treeop0, treeop1,
                       subtarget, &op0, &op1, modifier);
 
       /* Convert A - const to A + (-const).  */
@@ -8693,22 +8703,22 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
       /* If first operand is constant, swap them.
         Thus the following special case checks need only
         check the second operand.  */
-      if (TREE_CODE (TREE_OPERAND (exp, 0)) == INTEGER_CST)
+      if (TREE_CODE (treeop0) == INTEGER_CST)
        {
-         tree t1 = TREE_OPERAND (exp, 0);
-         TREE_OPERAND (exp, 0) = TREE_OPERAND (exp, 1);
-         TREE_OPERAND (exp, 1) = t1;
+         tree t1 = treeop0;
+         treeop0 = treeop1;
+         treeop1 = t1;
        }
 
       /* Attempt to return something suitable for generating an
         indexed address, for machines that support that.  */
 
       if (modifier == EXPAND_SUM && mode == ptr_mode
-         && host_integerp (TREE_OPERAND (exp, 1), 0))
+         && host_integerp (treeop1, 0))
        {
-         tree exp1 = TREE_OPERAND (exp, 1);
+         tree exp1 = treeop1;
 
-         op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode,
+         op0 = expand_expr (treeop0, subtarget, VOIDmode,
                             EXPAND_SUM);
 
          if (!REG_P (op0))
@@ -8729,8 +8739,8 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
         in that narrower type with a result in the desired type,
         do it that way, and avoid the explicit type-conversion.  */
 
-      subexp0 = TREE_OPERAND (exp, 0);
-      subexp1 = TREE_OPERAND (exp, 1);
+      subexp0 = treeop0;
+      subexp1 = treeop1;
       subexp0_def = get_def_for_expr (subexp0, NOP_EXPR);
       subexp1_def = get_def_for_expr (subexp1, NOP_EXPR);
       top0 = top1 = NULL_TREE;
@@ -8848,7 +8858,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
       /* Possible optimization: compute the dividend with EXPAND_SUM
         then if the divisor is constant can optimize the case
         where some terms of the dividend have coeffs divisible by it.  */
-      expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
+      expand_operands (treeop0, treeop1,
                       subtarget, &op0, &op1, EXPAND_NORMAL);
       return expand_divmod (0, code, mode, op0, op1, target, unsignedp);
 
@@ -8861,17 +8871,17 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
     case ROUND_MOD_EXPR:
       if (modifier == EXPAND_STACK_PARM)
        target = 0;
-      expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
+      expand_operands (treeop0, treeop1,
                       subtarget, &op0, &op1, EXPAND_NORMAL);
       return expand_divmod (1, code, mode, op0, op1, target, unsignedp);
 
     case FIXED_CONVERT_EXPR:
-      op0 = expand_normal (TREE_OPERAND (exp, 0));
+      op0 = expand_normal (treeop0);
       if (target == 0 || modifier == EXPAND_STACK_PARM)
        target = gen_reg_rtx (mode);
 
-      if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == INTEGER_TYPE
-          && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))))
+      if ((TREE_CODE (TREE_TYPE (treeop0)) == INTEGER_TYPE
+          && TYPE_UNSIGNED (TREE_TYPE (treeop0)))
           || (TREE_CODE (type) == INTEGER_TYPE && TYPE_UNSIGNED (type)))
        expand_fixed_convert (target, op0, 1, TYPE_SATURATING (type));
       else
@@ -8879,27 +8889,27 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
       return target;
 
     case FIX_TRUNC_EXPR:
-      op0 = expand_normal (TREE_OPERAND (exp, 0));
+      op0 = expand_normal (treeop0);
       if (target == 0 || modifier == EXPAND_STACK_PARM)
        target = gen_reg_rtx (mode);
       expand_fix (target, op0, unsignedp);
       return target;
 
     case FLOAT_EXPR:
-      op0 = expand_normal (TREE_OPERAND (exp, 0));
+      op0 = expand_normal (treeop0);
       if (target == 0 || modifier == EXPAND_STACK_PARM)
        target = gen_reg_rtx (mode);
       /* expand_float can't figure out what to do if FROM has VOIDmode.
         So give it the correct mode.  With -O, cse will optimize this.  */
       if (GET_MODE (op0) == VOIDmode)
-       op0 = copy_to_mode_reg (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))),
+       op0 = copy_to_mode_reg (TYPE_MODE (TREE_TYPE (treeop0)),
                                op0);
       expand_float (target, op0,
-                   TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))));
+                   TYPE_UNSIGNED (TREE_TYPE (treeop0)));
       return target;
 
     case NEGATE_EXPR:
-      op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget,
+      op0 = expand_expr (treeop0, subtarget,
                         VOIDmode, EXPAND_NORMAL);
       if (modifier == EXPAND_STACK_PARM)
        target = 0;
@@ -8911,7 +8921,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
       return REDUCE_BIT_FIELD (temp);
 
     case ABS_EXPR:
-      op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget,
+      op0 = expand_expr (treeop0, subtarget,
                         VOIDmode, EXPAND_NORMAL);
       if (modifier == EXPAND_STACK_PARM)
        target = 0;
@@ -8926,7 +8936,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
        return op0;
 
       return expand_abs (mode, op0, target, unsignedp,
-                        safe_from_p (target, TREE_OPERAND (exp, 0), 1));
+                        safe_from_p (target, treeop0, 1));
 
     case MAX_EXPR:
     case MIN_EXPR:
@@ -8938,7 +8948,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
          || (REG_P (target)
              && REGNO (target) < FIRST_PSEUDO_REGISTER))
        target = gen_reg_rtx (mode);
-      expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
+      expand_operands (treeop0, treeop1,
                       target, &op0, &op1, EXPAND_NORMAL);
 
       /* First try to do it with a special MIN or MAX instruction.
@@ -9044,7 +9054,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
       return target;
 
     case BIT_NOT_EXPR:
-      op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget,
+      op0 = expand_expr (treeop0, subtarget,
                         VOIDmode, EXPAND_NORMAL);
       if (modifier == EXPAND_STACK_PARM)
        target = 0;
@@ -9095,13 +9105,13 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
       if (ALL_FIXED_POINT_MODE_P (mode))
        goto binop;
 
-      if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
+      if (! safe_from_p (subtarget, treeop1, 1))
        subtarget = 0;
       if (modifier == EXPAND_STACK_PARM)
        target = 0;
-      op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget,
+      op0 = expand_expr (treeop0, subtarget,
                         VOIDmode, EXPAND_NORMAL);
-      temp = expand_shift (code, mode, op0, TREE_OPERAND (exp, 1), target,
+      temp = expand_shift (code, mode, op0, treeop1, target,
                           unsignedp);
       if (code == LSHIFT_EXPR)
        temp = REDUCE_BIT_FIELD (temp);
@@ -9139,7 +9149,8 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
       if (! ignore
          && (target == 0
              || modifier == EXPAND_STACK_PARM
-             || ! safe_from_p (target, exp, 1)
+             || ! safe_from_p (target, treeop0, 1)
+             || ! safe_from_p (target, treeop1, 1)
              /* Make sure we don't have a hard reg (such as function's return
                 value) live across basic blocks, if not optimizing.  */
              || (!optimize && REG_P (target)
@@ -9161,7 +9172,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
     case TRUTH_NOT_EXPR:
       if (modifier == EXPAND_STACK_PARM)
        target = 0;
-      op0 = expand_expr (TREE_OPERAND (exp, 0), target,
+      op0 = expand_expr (treeop0, target,
                         VOIDmode, EXPAND_NORMAL);
       /* The parser is careful to generate TRUTH_NOT_EXPR
         only with operands that are always zero or one.  */
@@ -9185,7 +9196,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
       /* A COND_EXPR with its type being VOID_TYPE represents a
         conditional jump and is handled in
         expand_gimple_cond_expr.  */
-      gcc_assert (!VOID_TYPE_P (TREE_TYPE (exp)));
+      gcc_assert (!VOID_TYPE_P (type));
 
         /* Note that COND_EXPRs whose type is a structure or union
         are required to be constructed to contain assignments of
@@ -9194,8 +9205,8 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
 
         gcc_assert (!TREE_ADDRESSABLE (type)
                    && !ignore
-                   && TREE_TYPE (TREE_OPERAND (exp, 1)) != void_type_node
-                   && TREE_TYPE (TREE_OPERAND (exp, 2)) != void_type_node);
+                   && TREE_TYPE (treeop1) != void_type_node
+                   && TREE_TYPE (treeop2) != void_type_node);
 
        /* If we are not to produce a result, we have no target.  Otherwise,
         if a target was specified use it; it will not be used as an
@@ -9204,7 +9215,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
 
        if (modifier != EXPAND_STACK_PARM
          && original_target
-         && safe_from_p (original_target, TREE_OPERAND (exp, 0), 1)
+         && safe_from_p (original_target, treeop0, 1)
          && GET_MODE (original_target) == mode
 #ifdef HAVE_conditional_move
          && (! can_conditionally_move_p (mode)
@@ -9219,15 +9230,15 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
        NO_DEFER_POP;
        op0 = gen_label_rtx ();
        op1 = gen_label_rtx ();
-       jumpifnot (TREE_OPERAND (exp, 0), op0);
-       store_expr (TREE_OPERAND (exp, 1), temp,
+       jumpifnot (treeop0, op0);
+       store_expr (treeop1, temp,
                  modifier == EXPAND_STACK_PARM,
                  false);
 
        emit_jump_insn (gen_jump (op1));
        emit_barrier ();
        emit_label (op0);
-       store_expr (TREE_OPERAND (exp, 2), temp,
+       store_expr (treeop2, temp,
                  modifier == EXPAND_STACK_PARM,
                  false);
 
@@ -9241,8 +9252,8 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
 
     case MODIFY_EXPR:
       {
-       tree lhs = TREE_OPERAND (exp, 0);
-       tree rhs = TREE_OPERAND (exp, 1);
+       tree lhs = treeop0;
+       tree rhs = treeop1;
        gcc_assert (ignore);
 
        /* Check for |= or &= of a bitfield of size one into another bitfield
@@ -9278,10 +9289,10 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
       }
 
     case RETURN_EXPR:
-      if (!TREE_OPERAND (exp, 0))
+      if (!treeop0)
        expand_null_return ();
       else
-       expand_return (TREE_OPERAND (exp, 0));
+       expand_return (treeop0);
       return const0_rtx;
 
     case ADDR_EXPR:
@@ -9289,11 +9300,11 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
 
     case COMPLEX_EXPR:
       /* Get the rtx code of the operands.  */
-      op0 = expand_normal (TREE_OPERAND (exp, 0));
-      op1 = expand_normal (TREE_OPERAND (exp, 1));
+      op0 = expand_normal (treeop0);
+      op1 = expand_normal (treeop1);
 
       if (!target)
-       target = gen_reg_rtx (TYPE_MODE (TREE_TYPE (exp)));
+       target = gen_reg_rtx (TYPE_MODE (type));
 
       /* Move the real (op0) and imaginary (op1) parts to their location.  */
       write_complex_part (target, op0, false);
@@ -9302,11 +9313,11 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
       return target;
 
     case REALPART_EXPR:
-      op0 = expand_normal (TREE_OPERAND (exp, 0));
+      op0 = expand_normal (treeop0);
       return read_complex_part (op0, false);
 
     case IMAGPART_EXPR:
-      op0 = expand_normal (TREE_OPERAND (exp, 0));
+      op0 = expand_normal (treeop0);
       return read_complex_part (op0, true);
 
     case RESX_EXPR:
@@ -9354,7 +9365,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
       return const0_rtx;
 
     case LABEL_EXPR:
-      expand_label (TREE_OPERAND (exp, 0));
+      expand_label (treeop0);
       return const0_rtx;
 
     case ASM_EXPR:
@@ -9364,14 +9375,14 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
     case WITH_SIZE_EXPR:
       /* WITH_SIZE_EXPR expands to its first argument.  The caller should
         have pulled out the size to use in whatever context it needed.  */
-      return expand_expr_real (TREE_OPERAND (exp, 0), original_target, tmode,
+      return expand_expr_real (treeop0, original_target, tmode,
                               modifier, alt_rtl);
 
     case REALIGN_LOAD_EXPR:
       {
-        tree oprnd0 = TREE_OPERAND (exp, 0);
-        tree oprnd1 = TREE_OPERAND (exp, 1);
-        tree oprnd2 = TREE_OPERAND (exp, 2);
+        tree oprnd0 = treeop0;
+        tree oprnd1 = treeop1;
+        tree oprnd2 = treeop2;
         rtx op2;
 
         this_optab = optab_for_tree_code (code, type, optab_default);
@@ -9385,9 +9396,9 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
 
     case DOT_PROD_EXPR:
       {
-       tree oprnd0 = TREE_OPERAND (exp, 0);
-       tree oprnd1 = TREE_OPERAND (exp, 1);
-       tree oprnd2 = TREE_OPERAND (exp, 2);
+       tree oprnd0 = treeop0;
+       tree oprnd1 = treeop1;
+       tree oprnd2 = treeop2;
        rtx op2;
 
        expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
@@ -9399,8 +9410,8 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
 
     case WIDEN_SUM_EXPR:
       {
-        tree oprnd0 = TREE_OPERAND (exp, 0);
-        tree oprnd1 = TREE_OPERAND (exp, 1);
+        tree oprnd0 = treeop0;
+        tree oprnd1 = treeop1;
 
         expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
         target = expand_widen_pattern_expr (exp, op0, NULL_RTX, op1,
@@ -9412,7 +9423,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
     case REDUC_MIN_EXPR:
     case REDUC_PLUS_EXPR:
       {
-        op0 = expand_normal (TREE_OPERAND (exp, 0));
+        op0 = expand_normal (treeop0);
         this_optab = optab_for_tree_code (code, type, optab_default);
         temp = expand_unop (mode, this_optab, op0, target, unsignedp);
         gcc_assert (temp);
@@ -9422,7 +9433,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
     case VEC_EXTRACT_EVEN_EXPR:
     case VEC_EXTRACT_ODD_EXPR:
       {
-        expand_operands (TREE_OPERAND (exp, 0),  TREE_OPERAND (exp, 1),
+        expand_operands (treeop0,  treeop1,
                          NULL_RTX, &op0, &op1, EXPAND_NORMAL);
         this_optab = optab_for_tree_code (code, type, optab_default);
         temp = expand_binop (mode, this_optab, op0, op1, target, unsignedp,
@@ -9434,7 +9445,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
     case VEC_INTERLEAVE_HIGH_EXPR:
     case VEC_INTERLEAVE_LOW_EXPR:
       {
-        expand_operands (TREE_OPERAND (exp, 0),  TREE_OPERAND (exp, 1),
+        expand_operands (treeop0,  treeop1,
                          NULL_RTX, &op0, &op1, EXPAND_NORMAL);
         this_optab = optab_for_tree_code (code, type, optab_default);
         temp = expand_binop (mode, this_optab, op0, op1, target, unsignedp,
@@ -9453,7 +9464,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
     case VEC_UNPACK_HI_EXPR:
     case VEC_UNPACK_LO_EXPR:
       {
-       op0 = expand_normal (TREE_OPERAND (exp, 0));
+       op0 = expand_normal (treeop0);
        this_optab = optab_for_tree_code (code, type, optab_default);
        temp = expand_widen_pattern_expr (exp, op0, NULL_RTX, NULL_RTX,
                                          target, unsignedp);
@@ -9464,14 +9475,14 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
     case VEC_UNPACK_FLOAT_HI_EXPR:
     case VEC_UNPACK_FLOAT_LO_EXPR:
       {
-       op0 = expand_normal (TREE_OPERAND (exp, 0));
+       op0 = expand_normal (treeop0);
        /* The signedness is determined from input operand.  */
        this_optab = optab_for_tree_code (code,
-                                         TREE_TYPE (TREE_OPERAND (exp, 0)),
+                                         TREE_TYPE (treeop0),
                                          optab_default);
        temp = expand_widen_pattern_expr
          (exp, op0, NULL_RTX, NULL_RTX,
-          target, TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))));
+          target, TYPE_UNSIGNED (TREE_TYPE (treeop0)));
 
        gcc_assert (temp);
        return temp;
@@ -9480,8 +9491,8 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
     case VEC_WIDEN_MULT_HI_EXPR:
     case VEC_WIDEN_MULT_LO_EXPR:
       {
-       tree oprnd0 = TREE_OPERAND (exp, 0);
-       tree oprnd1 = TREE_OPERAND (exp, 1);
+       tree oprnd0 = treeop0;
+       tree oprnd1 = treeop1;
 
        expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
        target = expand_widen_pattern_expr (exp, op0, op1, NULL_RTX,
@@ -9493,7 +9504,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
     case VEC_PACK_TRUNC_EXPR:
     case VEC_PACK_SAT_EXPR:
     case VEC_PACK_FIX_TRUNC_EXPR:
-      mode = TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)));
+      mode = TYPE_MODE (TREE_TYPE (treeop0));
       goto binop;
 
     case COMPOUND_LITERAL_EXPR:
@@ -9523,7 +9534,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
 
   /* Here to do an ordinary binary operator.  */
  binop:
-  expand_operands (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
+  expand_operands (treeop0, treeop1,
                   subtarget, &op0, &op1, EXPAND_NORMAL);
  binop2:
   this_optab = optab_for_tree_code (code, type, optab_default);