1  /* { dg-do run } */
       2  /* { dg-require-ifunc "" } */
       3  /* { dg-options "-O2 -fipa-pta" } */
       4  
       5  #include <stdlib.h>
       6  #include <stdbool.h>
       7  
       8  #define hot __attribute__((hot))
       9  
      10  static hot void multiver_default(unsigned int in, bool *ret)
      11  {
      12  	if ( in & 1 ) {
      13  		*ret = false;
      14  	}else{
      15  		*ret = true;
      16  	}
      17  }
      18  
      19  static void (*resolve_multiver(void))(unsigned int in, bool *out)
      20  {
      21  	return &multiver_default;
      22  }
      23  
      24  __attribute__ ((ifunc("resolve_multiver")))
      25  static void multiver_test(unsigned int val, bool *ret);
      26  
      27  static hot bool do_test(unsigned int val)
      28  {
      29  	bool ret = false;
      30  
      31  	multiver_test(val, &ret);
      32  
      33  	return (ret == !(val & 0x1));
      34  }
      35  
      36  volatile unsigned int x = 2;
      37  int main()
      38  {
      39    int i;
      40    for(i = 1; i < x; i++) {
      41        unsigned int val = x;
      42        if ( !do_test(val) )
      43  	abort ();
      44    }
      45    return 0;
      46  }