Filed under unknown since there is no version tag for the
tree-cleanup-branch.
The problem probably also exists on mainline, but I have
not tried it there.

Consider this code,

-----------------------------------------------------
extern void foo (void);
extern int i;
void
bar (void)
{
  switch (i)
    {
    case 0:
      foo ();
      break;
    case 1:
      break;
    }
                                                                               
                
  switch (i)
    {
    case 0:
      foo ();
      break;
    case 1:
      break;
    }
}
-----------------------------------------------------

This gives the following .dse2 dump:

;; Function bar (bar)
                                                                               
                
bar ()
{
  int i.0;
                                                                               
                
<bb 0>:
  #   VUSE <i_2>;
  i.0_3 = i;
  switch (i.0_3)
    {
      case 0: goto <L0>;
      default : goto <L1>;
    }
                                                                               
                
<L0>:;
  #   i_6 = V_MAY_DEF <i_2>;
  foo ();
                                                                               
                
  # i_1 = PHI <i_2(0), i_6(1)>;
<L1>:;
  #   VUSE <i_1>;
  i.0_4 = i;
  switch (i.0_4)
    {
      case 0: goto <L4>;
      default : goto <L5>;
    }
                                                                               
                
<L4>:;
  #   i_5 = V_MAY_DEF <i_1>;
  foo ();
                                                                               
                
<L5>:;
  return;
                                                                               
                
}

If the first switch goes through the default case, the
switch condition "i" is not call clobbered by the call
to "foo ()" so in the second switch "i" is unchanged and
we can thread the jump.

We don't catch this jump threading opportunity on trees,
but we *do* catch it on RTL.  This is *the* major source
of missed jump threads on the tree-cleanup-branch (we
catch rougly a thousand of these on the cc1-i file set).

If we teach the tree optimizers to catch this case, we
can almost certainly kill the RTL thread_jump junk on the
tree-cleanup-branch.

-- 
           Summary: Missed jump threading optimization
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Keywords: missed-optimization, alias, TREE
          Severity: normal
          Priority: P2
         Component: tree-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: steven at gcc dot gnu dot org
                CC: dnovillo at redhat dot com,gcc-bugs at gcc dot gnu dot
                    org


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

Reply via email to