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/15757] New: Convert "If (a >= b) X else if (b <= a) Y" into "if (a >= b) X".


void bar1 (void);
void bar2 (void);

void
foo (unsigned int a, unsigned int b)
{
  if (a >= b)
    bar1 ();
  else if (b <= a)
    bar2 ();
}

The last tree-ssa form looks like so:

foo (a, b)
{
<bb 0>:
  if (a_1 >= b_2) goto <L0>; else goto <L1>;

<L0>:;
  bar1 () [tail call];
  goto <bb 4> (<L3>);

<L1>:;
  if (b_2 <= a_1) goto <L2>; else goto <L3>;

<L2>:;
  bar2 () [tail call];

<L3>:;
  return;

}

Note that the second "if" should go away completely as the two "if"s
are identical except the order of the variables appearing in the condition.

This actually occurs in alias.i.t50.tailc like so:

  if (T.1029_168 >= T.1030_170) goto <L6>; else goto <L2>;

<L2>:;
  if (T.1030_170 <= T.1029_168) goto <L3>; else goto <L4>;

If I have the identical conditions twice, including the order of the variables,
then the second "if" goes away as expected.

-- 
           Summary: Convert "If (a >= b) X else if (b <= a) Y" into "if (a
                    >= b) X".
           Product: gcc
           Version: 3.5.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: enhancement
          Priority: P2
         Component: tree-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: kazu at cs dot umass dot edu
                CC: gcc-bugs at gcc dot gnu dot org


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


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