+2003-10-11 Roger Sayle <roger@eyesopen.com>
+
+ * expr.c (expand_expr <PLUS_EXPR>): Let expand_operands call
+ safe_from_p for us, once it chooses an evaluation order.
+ (expand_expr <MULT_EXPR>): Likewise.
+ (expand_expr <MIN_EXPR> <MAX_EXPR>): Likewise. If expand_operands
+ places the second operand in "target", swap the operands.
+ (do_store_flag): Let expand_operands call safe_from_p for us.
+
2003-10-11 Eric Botcazou <ebotcazou@libertysurf.fr>
PR optimization/12544
}
}
- if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
- subtarget = 0;
-
/* No sense saving up arithmetic to be done
if it's all in the wrong mode to form part of an address.
And force_operand won't know whether to sign-extend or
TYPE_MODE (TREE_TYPE (exp1))));
}
- if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
- subtarget = 0;
-
if (modifier == EXPAND_STACK_PARM)
target = 0;
target = original_target;
if (target == 0
|| modifier == EXPAND_STACK_PARM
- || ! safe_from_p (target, TREE_OPERAND (exp, 1), 1)
|| (GET_CODE (target) == MEM && MEM_VOLATILE_P (target))
|| GET_MODE (target) != mode
|| (GET_CODE (target) == REG
if (GET_CODE (target) == MEM)
target = gen_reg_rtx (mode);
+ /* If op1 was placed in target, swap op0 and op1. */
+ if (target != op0 && target == op1)
+ {
+ rtx tem = op0;
+ op0 = op1;
+ op1 = tem;
+ }
+
if (target != op0)
emit_move_insn (target, op0);
}
if (! get_subtarget (target)
- || GET_MODE (subtarget) != operand_mode
- || ! safe_from_p (subtarget, arg1, 1))
+ || GET_MODE (subtarget) != operand_mode)
subtarget = 0;
expand_operands (arg0, arg1, subtarget, &op0, &op1, 0);
--- /dev/null
+/* Check that MAX_EXPR and MIN_EXPR are working properly. */
+
+#define MAX(X,Y) ((X) > (Y) ? (X) : (Y))
+#define MIN(X,Y) ((X) < (Y) ? (X) : (Y))
+
+extern void abort (void);
+
+int main()
+{
+ int ll_bitsize, ll_bitpos;
+ int rl_bitsize, rl_bitpos;
+ int end_bit;
+
+ ll_bitpos = 32; ll_bitsize = 32;
+ rl_bitpos = 0; rl_bitsize = 32;
+
+ end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
+ if (end_bit != 64)
+ abort ();
+ end_bit = MAX (rl_bitpos + rl_bitsize, ll_bitpos + ll_bitsize);
+ if (end_bit != 64)
+ abort ();
+ end_bit = MIN (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
+ if (end_bit != 32)
+ abort ();
+ end_bit = MIN (rl_bitpos + rl_bitsize, ll_bitpos + ll_bitsize);
+ if (end_bit != 32)
+ abort ();
+ return 0;
+}
+