/* This test was causing an ICE in DCE because we were allowing void *
   pointers to have a memory tag, which we were copying when doing copy
   propagation.  Since void * can never be de-referenced, its memory tag
   was never renamed.  */

/* { dg-do compile } */
/* { dg-options "-O -ftree-dominator-opts -std=gnu89" } */

typedef __SIZE_TYPE__ size_t;
typedef union tree_node *tree;
struct operands_d
{
  tree *def_op;
};

void
gt_ggc_mx_operands_d (void *x_p)
{
  struct operands_d *const x = (struct operands_d *) x_p;
  if ((*x).def_op != ((void *) 0))
    {
      size_t i0;
      do
	{
	  const void *const a__ = ((*x).def_op);
	  if (a__ != ((void *) 0) && a__ != (void *) 1)
	    ggc_set_mark (a__);
	}
      while (0);
      for (i0 = 0; i0 < (size_t) (1); i0++)
	{
	  do
	    {
	      if ((void *) (*x).def_op[i0] != ((void *) 0))
		gt_ggc_mx_lang_tree_node ((*x).def_op[i0]);
	    }
	  while (0);
	}
    }
}
