http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49217

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |hubicka at gcc dot gnu.org

--- Comment #2 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-05-29 
10:56:58 UTC ---
Partial inlining is responsible for this.  With -fdump-tree-all-details we
ICE in CFG-cleanup that runs after fnsplit.

Then IPA pure-const computes garbage so alias analysis is confused.  Hmm.
main calls DFS:

void DFS(int)/83(71) @0x1429ec580 (asm: _Z3DFSi) availability:available
analyzed 12 time, 13 benefit (114 after inlining) 8 size, 5 benefit (17 after
inlining) needed reachable body externally_visible finalized inlinable
  called by: int main()/84 (0.58 per call) void _Z3DFSi.part.0(int)/97 (6.17
per call)
  calls: void _Z3DFSi.part.0(int)/97 (inlined) (0.61 per call)
  References:  var:bool visited [2] (read)
  Refering this function:

void _Z3DFSi.part.0(int)/97(-1) @0x101764dc0 (asm: _Z3DFSi.part.0) (inline copy
in void DFS(int)/83) availability:local analyzed 181 time, 13 benefit 14 size,
5 benefit reachable body local prevailing_def_ironly finalized inlinable
  called by: void DFS(int)/83 (0.61 per call) (inlined)
  calls: void DFS(int)/83 (6.17 per call) (nested in 2 loops)
  References:  var:bool visited [2] (write) var:std::vector<int> g [2] (addr)
var:std::vector<int> g [2] (addr)
  Refering this function:

but

Starting cycle
  Visiting void DFS(int)/83 state:const looping 0
    Call to void _Z3DFSi.part.0(int)/97 state:pure looping:1
    nonreadonly global var read
  Visiting void _Z3DFSi.part.0(int)/97 state:pure looping 1
    Call to void DFS(int)/83 state:const looping:0
    nonreadonly global var read
Result pure looping 1Function found to be looping pure: void DFS(int)Function
found to be looping pure: void _Z3DFSi.part.0(int)

so it seems, contrary to the comment from local analysis code, at IPA
propagation time the IPA references are _not_ taken into account.

Shouldn't bot indirect call processing and ipa reference walking use
w and not node?

Thus, the bug seems to be fixed with

Index: ipa-pure-const.c
===================================================================
--- ipa-pure-const.c    (revision 174393)
+++ ipa-pure-const.c    (working copy)
@@ -1223,7 +1223,7 @@
         break;

       /* Now process the indirect call.  */
-          for (ie = node->indirect_calls; ie; ie = ie->next_callee)
+          for (ie = w->indirect_calls; ie; ie = ie->next_callee)
         {
           enum pure_const_state_e edge_state = IPA_CONST;
           bool edge_looping = false;
@@ -1246,7 +1246,7 @@
         break;

       /* And finally all loads and stores.  */
-      for (i = 0; ipa_ref_list_reference_iterate (&node->ref_list, i, ref);
i++)
+      for (i = 0; ipa_ref_list_reference_iterate (&w->ref_list, i, ref); i++)
         {
           enum pure_const_state_e ref_state = IPA_CONST;
           bool ref_looping = false;

Reply via email to