diff options
author | Jakub Jelinek <jakub@redhat.com> | 2022-01-05 10:45:26 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2022-01-05 10:45:26 +0100 |
commit | a4c2e62d60f47d47cdd94951e16b0de50495cdab (patch) | |
tree | b9cc67bf30b21cd6ad4cff43af9b193c52e8f4ec /gcc | |
parent | 4ce3bd7993bc8413197e07c4f54052e4ecaeccaa (diff) | |
download | gcc-a4c2e62d60f47d47cdd94951e16b0de50495cdab.zip gcc-a4c2e62d60f47d47cdd94951e16b0de50495cdab.tar.gz gcc-a4c2e62d60f47d47cdd94951e16b0de50495cdab.tar.bz2 |
gimple-fold: Remove incorrect folding of debug stmts [PR103691]
For ADDR_EXPR gimple_debug_bind_get_value fold_stmt_1 uses
maybe_canonicalize_mem_ref_addr earlier and I think that should
resolve the concerns raised in PR52329. But folding ADDR_EXPR
operand using maybe_fold_reference and then taking address of that
looks like an invalid transformation, it can transform
# DEBUG D.4293 => &a[0]
into
# DEBUG D.4293 => &2.0e+0
etc., all we want to allow are the lhs folding of the operand which
maybe_fold_reference no longer does since r12-21-g0bf8cd9d5e8ac.
2022-01-05 Jakub Jelinek <jakub@redhat.com>
PR fortran/103691
* gimple-fold.c (fold_stmt_1): Don't call maybe_fold_reference
for DEBUG stmts with ADDR_EXPR gimple_debug_bind_get_value,
it can do unwanted rhs folding like &a[0] into &2.0 etc.
* gfortran.dg/pr103691.f90: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/gimple-fold.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr103691.f90 | 9 |
2 files changed, 10 insertions, 14 deletions
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index 80e7d89..77c551a 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -6283,8 +6283,7 @@ fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace, tree (*valueize) (tree)) if (gimple_debug_bind_p (stmt)) { tree val = gimple_debug_bind_get_value (stmt); - if (val - && REFERENCE_CLASS_P (val)) + if (val && REFERENCE_CLASS_P (val)) { tree tem = maybe_fold_reference (val); if (tem) @@ -6293,18 +6292,6 @@ fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace, tree (*valueize) (tree)) changed = true; } } - else if (val - && TREE_CODE (val) == ADDR_EXPR) - { - tree ref = TREE_OPERAND (val, 0); - tree tem = maybe_fold_reference (ref); - if (tem) - { - tem = build_fold_addr_expr_with_type (tem, TREE_TYPE (val)); - gimple_debug_bind_set_value (stmt, tem); - changed = true; - } - } } break; diff --git a/gcc/testsuite/gfortran.dg/pr103691.f90 b/gcc/testsuite/gfortran.dg/pr103691.f90 new file mode 100644 index 0000000..f1f551e --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr103691.f90 @@ -0,0 +1,9 @@ +! PR fortran/103691 +! { dg-do compile } +! { dg-options "-O2 -g" } + +program pr103691 + real, parameter :: a(0) = 2.0 + real, allocatable :: b(:) + allocate (b, mold=a) +end |