/* { dg-do compile } */
/* { dg-options "-O1 -fdump-tree-dom3" } */
/* LLVM LOCAL test not applicable */
/* { dg-require-fdump "" } */

extern void abort (void);
union tree_node;
typedef union tree_node *tree;
struct tree_vec
{
  int length;
  tree a[1];
};
struct tree_type
{
  tree binfo;
};
union tree_node
{
  struct tree_type type;
  struct tree_vec vec;
};
void
record_component_aliases (type)
     tree type;
{
  if (type->type.binfo->vec.length)
    abort ();
  for (; ((
	    {
	    const tree __z = type->type.binfo;
	    if (type->type.binfo->vec.length)
	    abort ();
 type->type.binfo->vec.a[4];}
	  )->vec.length);)
    {
      if (4 >= type->type.binfo->vec.length)
	abort ();
      blah ();
    }
}

/* The call to blah should have been eliminated.  If the call is not
   eliminated, then dominator optimizations failed and it'll be
   impossible to delete other unnecessary code.  */
/* { dg-final { scan-tree-dump-not "blah \\(\\)" "dom3" } } */
  
/* There should be two IF conditionals.  */
/* { dg-final { scan-tree-dump-times "if " 2 "dom3"} } */
                                                                                
/* There should be a single load of type.binfo.  */
/* { dg-final { scan-tree-dump-times "type\\.binfo" 1 "dom3"} } */

/* There should be two loads of vec.length.  */
/* { dg-final { scan-tree-dump-times "vec.length" 2 "dom3"} } */

/* { dg-final { cleanup-tree-dump "dom3" } } */
