/* { dg-do run } */ /* { dg-require-ifunc "" } */ /* { dg-options "-O2 -fipa-pta" } */ #include <stdlib.h> #include <stdbool.h> #define hot __attribute__((hot)) static hot void multiver_default(unsigned int in, bool *ret) { if ( in & 1 ) { *ret = false; }else{ *ret = true; } } static void (*resolve_multiver(void))(unsigned int in, bool *out) { return &multiver_default; } __attribute__ ((ifunc("resolve_multiver"))) static void multiver_test(unsigned int val, bool *ret); static hot bool do_test(unsigned int val) { bool ret = false; multiver_test(val, &ret); return (ret == !(val & 0x1)); } volatile unsigned int x = 2; int main() { int i; for(i = 1; i < x; i++) { unsigned int val = x; if ( !do_test(val) ) abort (); } return 0; }