aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2002-04-16 08:09:39 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2002-04-16 08:09:39 +0200
commita9772b60f3716f6f82d695bd0fc0300b87ca0b89 (patch)
treeb073fded453a1e3b898f1d4fb78e2e1cb3506b84 /gcc/expr.c
parent0f2680051d915c63fa287f9cbdcf666d62b836af (diff)
downloadgcc-a9772b60f3716f6f82d695bd0fc0300b87ca0b89.zip
gcc-a9772b60f3716f6f82d695bd0fc0300b87ca0b89.tar.gz
gcc-a9772b60f3716f6f82d695bd0fc0300b87ca0b89.tar.bz2
re PR middle-end/6279 (gcc-3.1 miscompiles qmake on IA-64)
PR middle-end/6279 * expr.c (store_expr): Don't copy if DECL_RTL (exp) == target. * expr.c (safe_from_p): Cleanup: use DECL_RTL_IF_SET. From-SVN: r52356
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index c5b1ece..55002af 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -4125,7 +4125,12 @@ store_expr (exp, target, want_value)
|| (temp != target && (side_effects_p (temp)
|| side_effects_p (target))))
&& TREE_CODE (exp) != ERROR_MARK
- && ! dont_store_target)
+ && ! dont_store_target
+ /* If store_expr stores a DECL whose DECL_RTL(exp) == TARGET,
+ but TARGET is not valid memory reference, TEMP will differ
+ from TARGET although it is really the same location. */
+ && (TREE_CODE_CLASS (TREE_CODE (exp)) != 'd'
+ || target != DECL_RTL_IF_SET (exp)))
{
target = protect_from_queue (target, 1);
if (GET_MODE (temp) != GET_MODE (target)
@@ -5598,7 +5603,7 @@ safe_from_p (x, exp, top_p)
switch (TREE_CODE_CLASS (TREE_CODE (exp)))
{
case 'd':
- exp_rtl = DECL_RTL_SET_P (exp) ? DECL_RTL (exp) : NULL_RTX;
+ exp_rtl = DECL_RTL_IF_SET (exp);
break;
case 'c':