(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
tree-ssa/
loop-25.c
       1  /* { dg-do compile } */
       2  /* { dg-options "-O1 -fdump-tree-profile_estimate" } */
       3  
       4  int foo(void);
       5  void bla(void);
       6  void bar(void);
       7  
       8  void test1 (void)
       9  {
      10    unsigned i;
      11  
      12    /* Only one loop should be found here.  */
      13    i = 0;
      14    while (1)
      15      {
      16        i++;
      17        if (i == 100)
      18  	break;
      19  
      20        if (foo ())
      21  	bla ();
      22        else
      23  	bar ();
      24      }
      25  }
      26  
      27  void test2 (void)
      28  {
      29    unsigned i, j;
      30  
      31    /* Two loops should be found, in this case.  */
      32    i = j = 0;
      33    while (1)
      34      {
      35        j++;
      36        foo ();
      37        if (j < 100)
      38  	continue;
      39  
      40        i++;
      41        j = 0;
      42        if (i == 100)
      43  	break;
      44      }
      45  }
      46  
      47  void test3 (void)
      48  {
      49    unsigned i, j, k;
      50  
      51    /* Three loops.  */
      52    i = j = k = 0;
      53    while (1)
      54      {
      55        j++;
      56        foo ();
      57        if (j < 100)
      58  	continue;
      59  
      60        j = 0;
      61        k++;
      62        if (k < 100)
      63  	continue;
      64  
      65        k = 0;
      66        i++;
      67        if (i == 100)
      68  	break;
      69      }
      70  }
      71  
      72  void test4 (void)
      73  {
      74    unsigned i, j, k;
      75  
      76    /* Two loops with a nested subloop.  */
      77    i = j = 0;
      78    while (1)
      79      {
      80        j++;
      81        foo ();
      82        for (k = 0; k < 100; k++)
      83  	foo ();
      84  
      85        if (j < 100)
      86  	continue;
      87  
      88        i++;
      89        j = 0;
      90        if (i == 100)
      91  	break;
      92      }
      93  }
      94  
      95  
      96  void test5 (void)
      97  {
      98    unsigned i, j;
      99  
     100    /* Both subloop and non-subloop back edges.  */
     101    i = j = 0;
     102    while (1)
     103      {
     104        j++;
     105        foo ();
     106        if (j < 100)
     107  	continue;
     108        j = 0;
     109  
     110        i++;
     111        if (i == 100)
     112  	break;
     113  
     114        if (foo ())
     115  	bla ();
     116        else
     117  	bar ();
     118      }
     119  }
     120  
     121  /* { dg-final { scan-tree-dump-times "Disambiguating loop" 5 "profile_estimate" } } */
     122  /* For the following xfail marks, see PR35629.  */
     123  /* { dg-final { scan-tree-dump-times "Found latch edge" 5 "profile_estimate" { xfail *-*-* } } } */
     124  /* { dg-final { scan-tree-dump-times "Merged latch edges" 2 "profile_estimate" { xfail *-*-* } } } */
     125  /* { dg-final { scan-tree-dump-times "4 loops found" 2 "profile_estimate" { xfail *-*-* } } } */
     126  /* { dg-final { scan-tree-dump-times "3 loops found" 2 "profile_estimate" { xfail *-*-* } } } */
     127  /* { dg-final { scan-tree-dump-times "2 loops found" 1 "profile_estimate" { xfail *-*-* } } } */
     128