https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80032

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Priority|P3                          |P2
                 CC|                            |jakub at gcc dot gnu.org

--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
The clobbers are on paths founds dead by DCE.  We basically have

   if (cleanup)
     D.2369 ={v} {CLOBBER;}

which, given the clobber isn't really "necessary", gets completely removed.

We can't simply promote the clobber to happen unconditionally.  Simply leaving
the conditional around like with

Index: gcc/tree-ssa-dce.c
===================================================================
--- gcc/tree-ssa-dce.c  (revision 246082)
+++ gcc/tree-ssa-dce.c  (working copy)
@@ -182,6 +182,8 @@ mark_operand_necessary (tree op)
   worklist.safe_push (stmt);
 }

+static void
+mark_control_dependent_edges_necessary (basic_block bb, bool ignore_self);

 /* Mark STMT as necessary if it obviously is.  Add it to the worklist if
    it can make other statements necessary.
@@ -277,7 +279,11 @@ mark_stmt_if_obviously_necessary (gimple

     case GIMPLE_ASSIGN:
       if (gimple_clobber_p (stmt))
-       return;
+       {
+         if (aggressive)
+           mark_control_dependent_edges_necessary (gimple_bb (stmt), true);
+         return;
+       }
       break;

     default:

results in us eventually doing the clobber unconditionally anyway through
threading and we generate larger code:

> g++-7 -c t.ii -O2
> size t.o
   text    data     bss     dec     hex filename
   1384       0       0    1384     568 t.o
> g++-7 -c t.ii -O2 -B.
> size t.o
   text    data     bss     dec     hex filename
   1479       0       0    1479     5c7 t.o

but

> g++-7 -c t.ii -O2 -B. -fstack-usage -Wstack-usage=96
t.ii: In function ‘void test::FN(test::db::ManagedObject&, const
test::BitMask&’:
t.ii:31:6: warning: stack usage is 112 bytes [-Wstack-usage=]
 void FN(ManagedObject &k, const BitMask &) {
      ^~

which is a bit closer to the 96 bytes needed with gcc5 (which needed a text
size of only 1097 bytes btw, GCC 6 needs 1231 bytes).  With -Os and the patch
trunk needs 80 bytes stack and 1379 bytes text.

I think w/o the threading happening we cannot optimize stack usage later.

Jakub, any opinion on the above patch?

Reply via email to