https://gcc.gnu.org/g:e1da6283a1cbd5db474c0f7e5cca9b9876768199

commit r15-7946-ge1da6283a1cbd5db474c0f7e5cca9b9876768199
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Tue Mar 11 10:57:30 2025 +0100

    complex: Don't DCE unused COMPLEX_EXPRs for -O0 [PR119190]
    
    The PR116463 r15-3128 change regressed the following testcase at -O0.
    While for -O1+ we can do -fvar-tracking-assignments, for -O0 we don't
    (partly because it is compile time expensive and partly because at -O0
    most of the vars live most of their lifetime in memory slots), so if we
    DCE some statements, it can mean that DW_AT_location for some vars won't
    be available or even it won't be possible to put a breakpoint at some
    particular line in the source.
    We normally perform dce just in the subpasses of
    pass_local_optimization_passes or pass_all_optimizations or
    pass_all_optimizations_g, so don't do that at all for -O0.  So the complex
    change is an exception.  And it was described as a way to help forwprop and
    reassoc, neither applies to -O0.
    
    This regresses PR119120 again though, I'll post a patch for that 
momentarily.
    
    2025-03-11  Jakub Jelinek  <ja...@redhat.com>
    
            PR debug/119190
            * tree-complex.cc (update_complex_assignment, tree_lower_complex):
            Perform simple dce on dce_worklist only if optimize.
    
            * gfortran.dg/guality/pr119190.f90: New test.

Diff:
---
 gcc/testsuite/gfortran.dg/guality/pr119190.f90 | 13 +++++++++++++
 gcc/tree-complex.cc                            | 13 +++++++++----
 2 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/gcc/testsuite/gfortran.dg/guality/pr119190.f90 
b/gcc/testsuite/gfortran.dg/guality/pr119190.f90
new file mode 100644
index 000000000000..00ed67ea1e21
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/guality/pr119190.f90
@@ -0,0 +1,13 @@
+! PR debug/119190
+! { dg-do run }
+! { dg-options "-g" }
+
+program foo
+  integer :: ia, ib
+  complex :: ci
+  ia = 1
+  ib = 2
+  ci = cmplx(ia, ib)
+  print *, ia
+  print *, ib  ! { dg-final { gdb-test 12 "ci" "(1,2)" } }
+end program
diff --git a/gcc/tree-complex.cc b/gcc/tree-complex.cc
index f54e7e3e443d..8a812d4bf9b0 100644
--- a/gcc/tree-complex.cc
+++ b/gcc/tree-complex.cc
@@ -735,7 +735,8 @@ update_complex_assignment (gimple_stmt_iterator *gsi, tree 
r, tree i)
   update_stmt (stmt);
   if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt))
     bitmap_set_bit (need_eh_cleanup, gimple_bb (stmt)->index);
-  bitmap_set_bit (dce_worklist, SSA_NAME_VERSION (gimple_assign_lhs (stmt)));
+  if (optimize)
+    bitmap_set_bit (dce_worklist, SSA_NAME_VERSION (gimple_assign_lhs (stmt)));
 
   update_complex_components (gsi, gsi_stmt (*gsi), r, i);
 }
@@ -1967,7 +1968,8 @@ tree_lower_complex (void)
   complex_propagate.ssa_propagate ();
 
   need_eh_cleanup = BITMAP_ALLOC (NULL);
-  dce_worklist = BITMAP_ALLOC (NULL);
+  if (optimize)
+    dce_worklist = BITMAP_ALLOC (NULL);
 
   complex_variable_components = new int_tree_htab_type (10);
 
@@ -2014,8 +2016,11 @@ tree_lower_complex (void)
 
   gsi_commit_edge_inserts ();
 
-  simple_dce_from_worklist (dce_worklist, need_eh_cleanup);
-  BITMAP_FREE (dce_worklist);
+  if (optimize)
+    {
+      simple_dce_from_worklist (dce_worklist, need_eh_cleanup);
+      BITMAP_FREE (dce_worklist);
+    }
 
   unsigned todo
     = gimple_purge_all_dead_eh_edges (need_eh_cleanup) ? TODO_cleanup_cfg : 0;

Reply via email to