------- Comment #1 from tkoenig at gcc dot gnu dot org  2007-09-08 11:32 -------
An equivalent C testcase eliminates the array stores:

int foo(int *a,int *b,int *c,int *d)
{
    int val[3];
    val[0] = *a;
    val[1] = *b;
    val[2] = *c;
    return (val[0] != *d) && (val[1] != *d) && (val[2] != *d);
}
$ gcc -O3 -fdump-tree-optimized -S compare.c 
$ cat compare.c.116t.optimized 

;; Function foo (foo)

Analyzing Edge Insertions.

Opportunities in BB 5 for stmt/block reduction:
Splitting BB 5 for Common stmt list.  Original block is now BB6.
D.1138 = 0;
  Edge (2->5) lands here.
  Edge (3->5) lands here.
foo (a, b, c, d)
{
  int D.1143;
  int D.1138;
  int D.1137;
  int D.1136;

<bb 2>:
  D.1136 = *b;
  D.1137 = *c;
  D.1143 = *d;
  if (*a == D.1143)
    goto <bb 5>;
  else
    goto <bb 3>;

<bb 3>:
  if (D.1136 == D.1143)
    goto <bb 5>;
  else
    goto <bb 4>;

<bb 4>:
  (void) 0;
  D.1138 = (int) !(D.1137 == D.1143);
  goto <bb 6>;

<bb 5>:
  D.1138 = 0;

<bb 6>:
  return D.1138;

}

$ gcc -O3 -fdump-tree-optimized -S compare.c 
$ cat compare.c.116t.optimized 

;; Function foo (foo)

Analyzing Edge Insertions.

Opportunities in BB 5 for stmt/block reduction:
Splitting BB 5 for Common stmt list.  Original block is now BB6.
D.1138 = 0;
  Edge (2->5) lands here.
  Edge (3->5) lands here.
foo (a, b, c, d)
{
  int D.1143;
  int D.1138;
  int D.1137;
  int D.1136;

<bb 2>:
  D.1136 = *b;
  D.1137 = *c;
  D.1143 = *d;
  if (*a == D.1143)
    goto <bb 5>;
  else
    goto <bb 3>;

<bb 3>:
  if (D.1136 == D.1143)
    goto <bb 5>;
  else
    goto <bb 4>;

<bb 4>:
  (void) 0;
  D.1138 = (int) !(D.1137 == D.1143);
  goto <bb 6>;

<bb 5>:
  D.1138 = 0;

<bb 6>:
  return D.1138;

}


-- 

tkoenig at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
      Known to fail|                            |4.3.0


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

Reply via email to