/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-local-pure-const-details -fdelete-null-pointer-checks" } */

void *foo(int cond1, int cond2, int cond3)
{
  void *ret;
  void *a;
  void *b;

  if (cond1)
    a = __builtin_malloc (10);
  else
    a = __builtin_malloc (20);

  if (cond2)
    b = __builtin_malloc (30);
  else
    b = __builtin_malloc (40);

  if (cond3)
    ret = a;
  else
    ret = b;

  return ret;
}

void *foo2(int cond1, int cond2, int cond3)
{
  void *ret;
  void *a;
  void *b;
  void bar(void *, void *);

  if (cond1)
    a = __builtin_malloc (10);
  else
    a = __builtin_malloc (20);

  if (cond2)
    b = __builtin_malloc (30);
  else
    b = __builtin_malloc (40);

  bar (a, b);

  if (cond3)
    ret = a;
  else
    ret = b;

  return ret;
}

/* { dg-final { scan-tree-dump "Function found to be malloc: foo" "local-pure-const1" } } */
/* { dg-final { scan-tree-dump-not "Function found to be malloc: foo2" "local-pure-const1" } } */
