1; RUN: llc < %s -mcpu=atom -mtriple=i686-linux | FileCheck -check-prefix=ATOM32 %s 2; RUN: llc < %s -mcpu=core2 -mtriple=i686-linux | FileCheck -check-prefix=ATOM-NOT32 %s 3; RUN: llc < %s -mcpu=atom -mtriple=x86_64-linux | FileCheck -check-prefix=ATOM64 %s 4; RUN: llc < %s -mcpu=core2 -mtriple=x86_64-linux | FileCheck -check-prefix=ATOM-NOT64 %s 5; RUN: llc < %s -mcpu=slm -mtriple=i686-linux | FileCheck -check-prefix=SLM32 %s 6; RUN: llc < %s -mcpu=slm -mtriple=x86_64-linux | FileCheck -check-prefix=SLM64 %s 7; RUN: llc < %s -mcpu=goldmont -mtriple=i686-linux | FileCheck -check-prefix=SLM32 %s 8; RUN: llc < %s -mcpu=goldmont -mtriple=x86_64-linux | FileCheck -check-prefix=SLM64 %s 9 10 11; fn_ptr.ll 12%class.A = type { ptr } 13 14define i32 @test1() #0 { 15 ;ATOM-LABEL: test1: 16entry: 17 %call = tail call ptr @_Z3facv() 18 %vtable = load ptr, ptr %call, align 8 19 %0 = load ptr, ptr %vtable, align 8 20 ;ATOM32: movl (%ecx), %ecx 21 ;ATOM32: calll *%ecx 22 ;ATOM-NOT32: calll *(%ecx) 23 ;ATOM64: movq (%rcx), %rcx 24 ;ATOM64: callq *%rcx 25 ;ATOM-NOT64: callq *(%rcx) 26 ;SLM32: movl (%ecx), %ecx 27 ;SLM32: calll *%ecx 28 ;SLM64: movq (%rcx), %rcx 29 ;SLM64: callq *%rcx 30 tail call void %0(ptr %call) 31 ret i32 0 32} 33 34declare ptr @_Z3facv() #1 35 36; virt_fn.ll 37@p = external dso_local global ptr 38 39define i32 @test2() #0 { 40 ;ATOM-LABEL: test2: 41entry: 42 %0 = load ptr, ptr @p, align 8 43 %1 = load ptr, ptr %0, align 8 44 ;ATOM32: movl (%eax), %eax 45 ;ATOM32: calll *%eax 46 ;ATOM-NOT: calll *(%eax) 47 ;ATOM64: movq (%rax), %rax 48 ;ATOM64: callq *%rax 49 ;ATOM-NOT64: callq *(%rax) 50 ;SLM32: movl (%eax), %eax 51 ;SLM32: calll *%eax 52 ;SLM64: movq (%rax), %rax 53 ;SLM64: callq *%rax 54 tail call void %1(i32 2) 55 ret i32 0 56} 57