------- Additional Comments From rguenth at gcc dot gnu dot org  2005-05-16 
13:52 -------
It's a problem of tree-lowering.  In .t02.original we still have

  return <retval> = (int) (a && b);

in .t03.generic it's

bool doAnd(bool, bool) (a, b)
{
  int D.1578;
  bool iftmp.0;
  bool D.1582;
  bool D.1583;

  D.1582 = !a;
  if (D.1582)
    {
      goto <D1580>;
    }
  else
    {

    }
  D.1583 = !b;
  if (D.1583)
    {
      goto <D1580>;
    }
  else
    {

    }
  iftmp.0 = 1;
  goto <D1581>;
  <D1580>:;
  iftmp.0 = 0;
  <D1581>:;
  D.1578 = (int) iftmp.0;
  return D.1578;
}


Note that changing the function to

bool f(bool b1, bool b2) { int b1i = b1; int b2i = b2; return (!!b1i && !!b2i); 
}

results in the much better

bool manualAnd(bool, bool) (a, b)
{
  int D.1590;
  bool D.1591;
  bool D.1592;
  bool D.1593;
  
  {
    int ai;
    int bi;

    ai = (int) a;
    bi = (int) b;
    D.1591 = ai != 0;
    D.1592 = bi != 0;
    D.1593 = D.1591 && D.1592;
    D.1590 = (int) D.1593;
    return D.1590;
  }
}


-- 


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

Reply via email to