1 // RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm %s -o - | FileCheck %s
foo(int i)2 int __attribute__((target("sse4.2"))) foo(int i) { return 0; }
3 int __attribute__((target("arch=sandybridge"))) foo(int);
foo(int i)4 int __attribute__((target("arch=ivybridge"))) foo(int i) {return 1;}
foo(int i)5 int __attribute__((target("default"))) foo(int i) { return 2; }
6 
7 typedef int (*FuncPtr)(int);
8 void func(FuncPtr);
9 
bar()10 int bar() {
11   func(foo);
12   FuncPtr Free = &foo;
13   FuncPtr Free2 = foo;
14 
15   return 0;
16   return Free(1) + Free(2);
17 }
18 
19 // CHECK: @foo.ifunc = ifunc i32 (i32), i32 (i32)* ()* @foo.resolver
20 // CHECK: define i32 @foo.sse4.2(
21 // CHECK: ret i32 0
22 // CHECK: define i32 @foo.arch_ivybridge(
23 // CHECK: ret i32 1
24 // CHECK: define i32 @foo(
25 // CHECK: ret i32 2
26 
27 // CHECK: define i32 @bar()
28 // CHECK: call void @func(i32 (i32)* @foo.ifunc)
29 // CHECK: store i32 (i32)* @foo.ifunc
30 // CHECK: store i32 (i32)* @foo.ifunc
31 
32 // CHECK: declare i32 @foo.arch_sandybridge(
33