This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug tree-optimization/25243] New: Jump threading opportunity missed in tree-ssa but caught in jump1


static const int e[4] = { 16, 16, 20, 20 };

extern void foo (unsigned long *);

void
baz (unsigned long *r)
{
  unsigned long i;

  for (i = 0; i < 4; i++)
    if (e[i] == 16)
      break;

  if (i == 4)
    {
      foo (r);
    }
}

We have the following in the .vars tree dump:

;; Function baz (baz)

baz (r)
{
  long unsigned int i;

<bb 0>:
  i = 0;

<L0>:;
  if (MEM[symbol: e, index: (int *) i, step: 4B] == 16) goto <L5>; else goto
<L1>;

<L1>:;
  i = i + 1;
  if (i != 4) goto <L0>; else goto <L3>;

<L3>:;
  if (i == 4) goto <L4>; else goto <L5>;

<L4>:;
  foo (r);

<L5>:;
  return;

}

The first jump pass on RTL immediately optimizes away the redundant jump.

This kind of jump threading opportunity occurs very often.  About half of the
jump threadings on RTL in jump1 that I have looked at so far (several dozen)
are of this form.
I'm seeing this for AMD64 and i686, but I guess it happens everywhere.


-- 
           Summary: Jump threading opportunity missed in tree-ssa but caught
                    in jump1
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Keywords: missed-optimization, TREE
          Severity: normal
          Priority: P3
         Component: tree-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: steven at gcc dot gnu dot org


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]