From ffd837fe164a08ed4e3315009d61bb24c69fe04d Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Thu, 27 Mar 2008 17:09:54 +0000 Subject: [PATCH] re PR tree-optimization/35716 (gfortran.dg/assign_6.f and gfortran.dg/g77/dnrm2.f) 2008-03-27 Richard Guenther PR middle-end/35716 * fold-const.c (fold_comparison): Restrict distinct decl comparison folding to VAR_DECLs and PARM_DECLs. Do not solely rely on operand_equal_p. From-SVN: r133647 --- gcc/ChangeLog | 7 +++++++ gcc/fold-const.c | 10 +++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 19cb5670f75..529c23062a2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2008-03-27 Richard Guenther + + PR middle-end/35716 + * fold-const.c (fold_comparison): Restrict distinct decl + comparison folding to VAR_DECLs and PARM_DECLs. Do not + solely rely on operand_equal_p. + 2008-03-27 Richard Guenther PR c/32511 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index a7dcfc3ff90..fe78e6d76cf 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -8584,14 +8584,18 @@ fold_comparison (enum tree_code code, tree type, tree op0, tree op1) of local binding decls or constants. */ else if (indirect_base0 && indirect_base1 /* We know that !operand_equal_p (base0, base1, 0) - because the if condition was false. */ + because the if condition was false. But make + sure two decls are not the same. */ + && base0 != base1 && TREE_CODE (arg0) == ADDR_EXPR && TREE_CODE (arg1) == ADDR_EXPR - && ((DECL_P (base0) + && (((TREE_CODE (base0) == VAR_DECL + || TREE_CODE (base0) == PARM_DECL) && (targetm.binds_local_p (base0) || CONSTANT_CLASS_P (base1))) || CONSTANT_CLASS_P (base0)) - && ((DECL_P (base1) + && (((TREE_CODE (base1) == VAR_DECL + || TREE_CODE (base1) == PARM_DECL) && (targetm.binds_local_p (base1) || CONSTANT_CLASS_P (base0))) || CONSTANT_CLASS_P (base1))) -- 2.30.2