static int filelocal = 1;	/* In Data section */
static int filelocal_bss;	/* In BSS section */
#ifndef __STDC__
#define	const	/**/
#endif
static const int filelocal_ro = 201;	/* In Read-Only Data section */

extern void init1();
extern void foo();

int autovars (int bcd, int abc);
int localscopes (int x);
int useit (int val);
int useitp (const int *val);
void init0();
void marker1 ();
void marker2 ();
void marker3 ();
void marker4 ();

int main ()
{
  init0 ();
  foo ();
  autovars (5, 6);
  localscopes (0);
}

/* On some systems, such as AIX, unreferenced variables are deleted
   from the executable.  On other compilers, such as ARM RealView,
   const variables without their address taken are deleted.  */
void usestatics ()
{
  useitp (&filelocal);
  useitp (&filelocal_bss);
  useitp (&filelocal_ro);
}

void init0 ()
{
  filelocal_bss = 101;
  init1 ();
}

/* This is to derail optimizer in localscopes.
   Return 1 + 2 + . . . + N.  */
int
sum_upto (int n)
{
  int i;
  int retval = 0;

  for (i = 1; i <= n; ++i)
    retval += i;
  return retval;
}

int
useit (int val)
{
    static int usedval;

    usedval = val;
    return val + sum_upto (0);
}

int
useitp (const int *val)
{
    static int usedval;

    usedval = *val;
    return *val + sum_upto (0);
}

int
autovars (int bcd, int abc)
{
    int  i0 =  useit (0),  i1 =  useit (1),  i2 =  useit (2);
    int  i3 =  useit (3),  i4 =  useit (4),  i5 =  useit (5);
    int  i6 =  useit (6),  i7 =  useit (7),  i8 =  useit (8);
    int  i9 =  useit (9), i10 = useit (10), i11 = useit (11);
    int i12 = useit (12), i13 = useit (13), i14 = useit (14);
    int i15 = useit (15), i16 = useit (16), i17 = useit (17);
    int i18 = useit (18), i19 = useit (19), i20 = useit (20);
    int i21 = useit (21), i22 = useit (22), i23 = useit (23);
    int i24 = useit (24), i25 = useit (25), i26 = useit (26);
    int i27 = useit (27), i28 = useit (28), i29 = useit (29);
    int i30 = useit (30), i31 = useit (31), i32 = useit (32);
    int i33 = useit (33), i34 = useit (34), i35 = useit (35);
    int i36 = useit (36), i37 = useit (37), i38 = useit (38);
    int i39 = useit (39), i40 = useit (40), i41 = useit (41);
    int i42 = useit (42), i43 = useit (43), i44 = useit (44);
    int i45 = useit (45), i46 = useit (46), i47 = useit (47);
    int i48 = useit (48), i49 = useit (49), i50 = useit (50);
    int i51 = useit (51), i52 = useit (52), i53 = useit (53);
    int i54 = useit (54), i55 = useit (55), i56 = useit (56);
    int i57 = useit (57), i58 = useit (58), i59 = useit (59);
    int i60 = useit (60), i61 = useit (61), i62 = useit (62);
    int i63 = useit (63), i64 = useit (64), i65 = useit (65);
    int i66 = useit (66), i67 = useit (67), i68 = useit (68);
    int i69 = useit (69), i70 = useit (70), i71 = useit (71);
    int i72 = useit (72), i73 = useit (73), i74 = useit (74);
    int i75 = useit (75), i76 = useit (76), i77 = useit (77);
    int i78 = useit (78), i79 = useit (79), i80 = useit (80);
    int i81 = useit (81), i82 = useit (82), i83 = useit (83);
    int i84 = useit (84), i85 = useit (85), i86 = useit (86);
    int i87 = useit (87), i88 = useit (88), i89 = useit (89);
    int i90 = useit (90), i91 = useit (91), i92 = useit (92);
    int i93 = useit (93), i94 = useit (94), i95 = useit (95);
    int i96 = useit (96), i97 = useit (97), i98 = useit (98);
    int i99 = useit (99);

    /* Use all 100 of the local variables to derail agressive optimizers.  */

    useit ( i0); useit ( i1); useit ( i2); useit ( i3); useit ( i4);
    useit ( i5); useit ( i6); useit ( i7); useit ( i8); useit ( i9);
    useit (i10); useit (i11); useit (i12); useit (i13); useit (i14);
    useit (i15); useit (i16); useit (i17); useit (i18); useit (i19);
    useit (i20); useit (i21); useit (i22); useit (i23); useit (i24);
    useit (i25); useit (i26); useit (i27); useit (i28); useit (i29);
    useit (i30); useit (i31); useit (i32); useit (i33); useit (i34);
    useit (i35); useit (i36); useit (i37); useit (i38); useit (i39);
    useit (i40); useit (i41); useit (i42); useit (i43); useit (i44);
    useit (i45); useit (i46); useit (i47); useit (i48); useit (i49);
    useit (i50); useit (i51); useit (i52); useit (i53); useit (i54);
    useit (i55); useit (i56); useit (i57); useit (i58); useit (i59);
    useit (i60); useit (i61); useit (i62); useit (i63); useit (i64);
    useit (i65); useit (i66); useit (i67); useit (i68); useit (i69);
    useit (i70); useit (i71); useit (i72); useit (i73); useit (i74);
    useit (i75); useit (i76); useit (i77); useit (i78); useit (i79);
    useit (i80); useit (i81); useit (i82); useit (i83); useit (i84);
    useit (i85); useit (i86); useit (i87); useit (i88); useit (i89);
    useit (i90); useit (i91); useit (i92); useit (i93); useit (i94);
    useit (i95); useit (i96); useit (i97); useit (i98); useit (i99);

    useit (abc); useit (bcd);

    marker1 ();
    return i0 + i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + i10
      + i11 + i12 + i13 + i14 + i15 + i16 + i17 + i18 + i19 + i20
      + i21 + i22 + i23 + i24 + i25 + i26 + i27 + i28 + i29 + i30
      + i31 + i32 + i33 + i34 + i35 + i36 + i37 + i38 + i39 + i40
      + i41 + i42 + i43 + i44 + i45 + i46 + i47 + i48 + i49 + i50
      + i51 + i52 + i53 + i54 + i55 + i56 + i57 + i58 + i59 + i60
      + i61 + i62 + i63 + i64 + i65 + i66 + i67 + i68 + i69 + i70
      + i71 + i72 + i73 + i74 + i75 + i76 + i77 + i78 + i79 + i80
      + i81 + i82 + i83 + i84 + i85 + i86 + i87 + i88 + i89 + i90
      + i91 + i92 + i93 + i94 + i95 + i96 + i97 + i98 + i99 + abc + bcd;
}

int
localscopes (int x)
{
    int localval;
    int retval;
    int i;

    localval = 0;
    useit (localval);

    {
	int localval = x + 4 + sum_upto (3); /* 10 */
	int localval1 = x + 5 + sum_upto (3); /* 11 */

	useit (localval);
	useit (localval1);
	marker2 ();
	{
	    int localval = localval1 + 3 + sum_upto (3); /* 20 */
	    int localval2 = localval1 + sum_upto (1); /* 12 */
	    useit (localval);
	    useit (localval2);
	    marker3 ();
	    {
		int localval = localval2 + 3 + sum_upto (5); /* 30 */
		int localval3 = localval2 + sum_upto (1); /* 13 */
		useit (localval);
		useit (localval3);
		marker4 ();
		retval = x + localval1 + localval2 + localval3;
	    }
	}
    }
    return retval;
}

void marker1 () {}
void marker2 () {}
void marker3 () {}
void marker4 () {}
