From: Roger Sayle Date: Mon, 20 Dec 2004 02:43:14 +0000 (+0000) Subject: re PR middle-end/19068 ([3.3 only] Wrong code for MIN_EXPR and MAX_EXPR) X-Git-Tag: releases/gcc-3.3.6~171 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8d79b7b686d8b4f4da3235e26f238800ddcac6aa;p=thirdparty%2Fgcc.git re PR middle-end/19068 ([3.3 only] Wrong code for MIN_EXPR and MAX_EXPR) PR middle-end/19068 * expr.c (expand_expr_real_1) : Ensure that target, op0 and op1 are all registers (or constants) before expanding the RTL comparison sequence [to avoid reg_overlap_mentioned (target, op1)]. * g++.dg/opt/max1.C: New test case. From-SVN: r92404 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8151e64a93c0..28cbd426ba61 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2004-12-19 Roger Sayle + + PR middle-end/19068 + * expr.c (expand_expr_real_1) : Ensure that target, op0 + and op1 are all registers (or constants) before expanding the RTL + comparison sequence [to avoid reg_overlap_mentioned (target, op1)]. + 2004-12-16 Eric Botcazou PR middle-end/18882 diff --git a/gcc/expr.c b/gcc/expr.c index a2b0c8305687..78b35db8c847 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -8462,9 +8462,14 @@ expand_expr (exp, target, tmode, modifier) /* At this point, a MEM target is no longer useful; we will get better code without it. */ - if (GET_CODE (target) == MEM) + if (! REG_P (target)) target = gen_reg_rtx (mode); + /* We generate better code and avoid problems with op1 mentioning + target by forcing op1 into a pseudo if it isn't a constant. */ + if (! CONSTANT_P (op1)) + op1 = force_reg (mode, op1); + if (target != op0) emit_move_insn (target, op0); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e1d6b270823c..383a8e6082a4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-12-19 Roger Sayle + + PR middle-end/19068 + * g++.dg/opt/max1.C: New test case. + 2004-12-16 Wolfgang Bangerth * g++.dg/other/complex1.C: New test.