/* PR 58106 testcase.  Verify that rdesc chain creating and lookup works with
   recursive inlining and master clone creation.  */
/* { dg-do compile } */
/* { dg-options "-O3"  } */

typedef struct rtx_def *rtx;
enum rtx_code {
  LAST_AND_UNUSED_RTX_CODE};
extern const char * const rtx_format[((int) LAST_AND_UNUSED_RTX_CODE)];
struct rtx_def {
  enum rtx_code code;
};
typedef int (*rtx_function) (rtx *, void *);
extern int for_each_rtx (rtx *, rtx_function, void *);
int
replace_label (rtx *x, void *data)
{
  rtx l = *x;
  if (l == (rtx) 0)
    {
 {
   rtx new_c, new_l;
   for_each_rtx (&new_c, replace_label, data);
 }
    }
}
static int
for_each_rtx_1 (rtx exp, int n, rtx_function f, void *data)
{
  int result, i, j;
  const char *format = (rtx_format[(int) (((enum rtx_code) (exp)->code))]);
  rtx *x;
  for (; format[n] != '\0'; n++)
    {
      switch (format[n])
 {
 case 'e':
   result = (*f) (x, data);
     {
       result = for_each_rtx_1 (*x, i, f, data);
     }
 }
    }
}
int
for_each_rtx (rtx *x, rtx_function f, void *data)
{
  int i;
  return for_each_rtx_1 (*x, i, f, data);
}
