1 // Check that we call llvm.load.relative() on a vtable function call. 2 3 // RUN: %clang_cc1 -no-opaque-pointers %s -triple=aarch64-unknown-fuchsia -O3 -S -o - -emit-llvm | FileCheck %s 4 5 // CHECK: define{{.*}} void @_Z5A_fooP1A(%class.A* noundef %a) local_unnamed_addr 6 // CHECK-NEXT: entry: 7 // CHECK-NEXT: [[this:%[0-9]+]] = bitcast %class.A* %a to i8** 8 // CHECK-NEXT: %vtable1 = load i8*, i8** [[this]] 9 // CHECK-NEXT: [[func_ptr:%[0-9]+]] = tail call i8* @llvm.load.relative.i32(i8* %vtable1, i32 0) 10 // CHECK-NEXT: [[func:%[0-9]+]] = bitcast i8* [[func_ptr]] to void (%class.A*)* 11 // CHECK-NEXT: tail call void [[func]](%class.A* {{[^,]*}} %a) 12 // CHECK-NEXT: ret void 13 // CHECK-NEXT: } 14 15 class A { 16 public: 17 virtual void foo(); 18 }; 19 20 void A_foo(A *a) { 21 a->foo(); 22 } 23