1  /* Verify that indirect inlining can also remove references of the functions it
       2     discovers calls for, even when nodes being inlined are virtual IPA-CP
       3     clones.  */
       4  /* { dg-do compile } */
       5  /* { dg-options "-O3 -fno-early-inlining -fdump-ipa-cp-details -fdump-ipa-inline -fdump-tree-optimized -fno-ipa-icf"  } */
       6  
       7  
       8  int global;
       9  
      10  void __attribute__ ((noinline, noclone, used))
      11  stuff (int i)
      12  {
      13    global = i;
      14  }
      15  
      16  int __attribute__ ((noinline,noclone)) get_input(void)
      17  {
      18    return 1;
      19  }
      20  
      21  static void
      22  hooray_1 ()
      23  {
      24    stuff (1);
      25  }
      26  
      27  static inline void
      28  hip2_1 (void (*g)())
      29  {
      30    int i;
      31    g ();
      32    /* Some stuff to make the function bigger so that hip1_1 gets inlined
      33       fiorst. */
      34    for (i = 0; i < get_input (); i++)
      35      {
      36        stuff (2);
      37        stuff (2+2);
      38      }
      39  }
      40  
      41  static inline void
      42  hip1_1 (void (*g)())
      43  {
      44    hip2_1 (g);
      45  }
      46  
      47  static void
      48  hooray_2 ()
      49  {
      50    stuff (1);
      51  }
      52  
      53  static inline void
      54  hip2_2 (void (*g)())
      55  {
      56    g ();
      57  }
      58  
      59  static inline void
      60  hip1_2 (void (*g)())
      61  {
      62    int i;
      63  
      64    hip2_2 (g);
      65  
      66    /* Some stuff to make the function bigger so that hip2_2 gets inlined
      67       fiorst. */
      68    for (i = 0; i < get_input (); i++)
      69      {
      70        stuff (2);
      71        stuff (2+2);
      72      }
      73  }
      74  
      75  int
      76  main (int argc, int *argv[])
      77  {
      78    int i;
      79  
      80    for (i = 0; i < get_input (); i++)
      81      {
      82        hip1_1 (hooray_1);
      83        hip1_2 (hooray_2);
      84      }
      85    return 0;
      86  }
      87  
      88  /* { dg-final { scan-ipa-dump-times "removing its cloning-created reference" 2 "cp"  } } */
      89  /* { dg-final { scan-ipa-dump "ipa-prop: Removed a reference"  "inline"  } } */
      90  /* { dg-final { scan-ipa-dump-times "ipa-prop: Removing cloning-created reference" 2 "inline"  } } */
      91  /* { dg-final { scan-tree-dump-not "hooray"  "optimized"  } } */