(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
long_branch.c
       1  /* { dg-do run } */
       2  /* { dg-options "-O2 -fno-reorder-blocks" } */
       3  /* { dg-skip-if "limited code space" { pdp11-*-* } } */
       4  /* { dg-timeout-factor 2.0 { target hppa*-*-* } } */
       5  
       6  void abort ();
       7  
       8  __attribute__((noinline, noclone)) int
       9  restore (int a, int b)
      10  {
      11    return a * b;
      12  }
      13  
      14  __attribute__((noinline, noclone)) void
      15  do_nothing (int *input)
      16  {
      17    *input = restore (*input, 1);
      18    return;
      19  }
      20  
      21  #define CASE_ENTRY(n) \
      22    case n: \
      23      sum = sum / (n + 1); \
      24      sum = restore (sum, n + 1); \
      25      if (sum == (n + addend)) \
      26        break;\
      27      sum = sum / (n + 2); \
      28      sum = restore (sum, n + 2); \
      29      sum = sum / (n + 3); \
      30      sum = restore (sum, n + 3); \
      31      sum = sum / (n + 4); \
      32      sum = restore (sum, n + 4); \
      33      sum = sum / (n + 5); \
      34      sum = restore (sum, n + 5); \
      35      sum = sum / (n + 6); \
      36      sum = restore (sum, n + 6); \
      37      sum = sum / (n + 7); \
      38      sum = restore (sum, n + 7); \
      39      sum = sum / (n + 8); \
      40      sum = restore (sum, n + 8); \
      41      sum = sum / (n + 9); \
      42      sum = restore (sum, n + 9); \
      43      sum = sum / (n + 10); \
      44      sum = restore (sum, n + 10); \
      45      sum = sum / (n + 11); \
      46      sum = restore (sum, n + 11); \
      47      sum = sum / (n + 12); \
      48      sum = restore (sum, n + 12); \
      49      sum = sum / (n + 13); \
      50      sum = restore (sum, n + 13); \
      51      sum = sum / (n + 14); \
      52      sum = restore (sum, n + 14); \
      53      sum = sum / (n + 15); \
      54      sum = restore (sum, n + 15); \
      55      sum = sum / (n + 16); \
      56      sum = restore (sum, n + 16); \
      57      sum = sum / (n + 17); \
      58      sum = restore (sum, n + 17); \
      59      sum = sum / (n + 18); \
      60      sum = restore (sum, n + 18); \
      61      sum = sum / (n + 19); \
      62      sum = restore (sum, n + 19); \
      63      sum = sum / (n + 20); \
      64      sum = restore (sum, n + 20); \
      65      sum = sum / (n + 21); \
      66      sum = restore (sum, n + 21); \
      67      sum = sum / (n + 22); \
      68      sum = restore (sum, n + 22); \
      69      sum = sum / (n + 23); \
      70      sum = restore (sum, n + 23); \
      71      sum = sum / (n + 24); \
      72      sum = restore (sum, n + 24); \
      73      sum = sum / (n + 25); \
      74      sum = restore (sum, n + 25); \
      75      sum = sum / (n + 26); \
      76      sum = restore (sum, n + 26); \
      77      sum = sum / (n + 27); \
      78      sum = restore (sum, n + 27); \
      79      sum = sum / (n + 28); \
      80      sum = restore (sum, n + 28); \
      81      sum = sum / (n + 29); \
      82      sum = restore (sum, n + 29); \
      83      sum = sum / (n + 30); \
      84      sum = restore (sum, n + 30); \
      85      sum = sum / (n + 31); \
      86      sum = restore (sum, n + 31); \
      87      sum = sum / (n + 32); \
      88      sum = restore (sum, n + 32); \
      89      sum = sum / (n + 33); \
      90      sum = restore (sum, n + 33); \
      91      sum = sum / (n + 34); \
      92      sum = restore (sum, n + 34); \
      93      sum = sum / (n + 35); \
      94      sum = restore (sum, n + 35); \
      95      sum = sum / (n + 36); \
      96      sum = restore (sum, n + 36); \
      97      break;
      98  
      99  __attribute__((noinline, noclone)) long long
     100  test_and_branch (int selector, int addend)
     101  {
     102    long long sum = selector + 1;
     103  
     104    if (selector > 64)
     105      {
     106  start:
     107        return sum - 1;
     108      }
     109    else
     110      {
     111        switch (selector)
     112  	{
     113  	  CASE_ENTRY (1)
     114  	  CASE_ENTRY (2)
     115  	  CASE_ENTRY (3)
     116  	  CASE_ENTRY (4)
     117  	  CASE_ENTRY (5)
     118  	  CASE_ENTRY (6)
     119  	  CASE_ENTRY (7)
     120  	  CASE_ENTRY (8)
     121  	  CASE_ENTRY (9)
     122  	  CASE_ENTRY (10)
     123  	  CASE_ENTRY (11)
     124  	  CASE_ENTRY (12)
     125  	  CASE_ENTRY (13)
     126  	  CASE_ENTRY (14)
     127  	  CASE_ENTRY (15)
     128  	  CASE_ENTRY (16)
     129  	  CASE_ENTRY (17)
     130  	  CASE_ENTRY (18)
     131  	  CASE_ENTRY (19)
     132  	  CASE_ENTRY (20)
     133  	  CASE_ENTRY (21)
     134  	  CASE_ENTRY (22)
     135  	  CASE_ENTRY (23)
     136  	  CASE_ENTRY (24)
     137  	  CASE_ENTRY (25)
     138  	  CASE_ENTRY (26)
     139  	  CASE_ENTRY (27)
     140  	  CASE_ENTRY (28)
     141  	  CASE_ENTRY (29)
     142  	  CASE_ENTRY (30)
     143  	  CASE_ENTRY (31)
     144  	  CASE_ENTRY (32)
     145  	  CASE_ENTRY (33)
     146  	  CASE_ENTRY (34)
     147  	  CASE_ENTRY (35)
     148  	  CASE_ENTRY (36)
     149  	  CASE_ENTRY (37)
     150  	  CASE_ENTRY (38)
     151  	  CASE_ENTRY (39)
     152  	  CASE_ENTRY (40)
     153  	  CASE_ENTRY (41)
     154  	  CASE_ENTRY (42)
     155  	  CASE_ENTRY (43)
     156  	  CASE_ENTRY (44)
     157  	  CASE_ENTRY (45)
     158  	  CASE_ENTRY (46)
     159  	  CASE_ENTRY (47)
     160  	  CASE_ENTRY (48)
     161  	  CASE_ENTRY (49)
     162  	  CASE_ENTRY (50)
     163  	  CASE_ENTRY (51)
     164  	  CASE_ENTRY (52)
     165  	  CASE_ENTRY (53)
     166  	  CASE_ENTRY (54)
     167  	  CASE_ENTRY (55)
     168  	  CASE_ENTRY (56)
     169  	  CASE_ENTRY (57)
     170  	  CASE_ENTRY (58)
     171  	  CASE_ENTRY (59)
     172  	  CASE_ENTRY (60)
     173  	  CASE_ENTRY (61)
     174  	  CASE_ENTRY (62)
     175  	  CASE_ENTRY (63)
     176  	  CASE_ENTRY (64)
     177  	}
     178  
     179        do_nothing ((int *)&sum);
     180  
     181        if (sum & 0x40)
     182  	goto start;
     183      }
     184  
     185    return -1;
     186  }
     187  
     188  int
     189  main (int argc, char **argv)
     190  {
     191    long long ret = test_and_branch (64, 1);
     192    if (ret != 64)
     193      abort ();
     194  
     195    ret = test_and_branch (7, 1);
     196    if (ret != -1)
     197      abort ();
     198  
     199    return 0;
     200  }