1; -stats requires asserts 2; REQUIRES: asserts 3 4; RUN: opt -S -passes=wholeprogramdevirt -whole-program-visibility -pass-remarks=wholeprogramdevirt -stats %s 2>&1 | FileCheck %s 5 6target datalayout = "e-p:64:64" 7target triple = "x86_64-unknown-linux-gnu" 8 9; CHECK: remark: {{.*}} uniform-ret-val: devirtualized a call to vf1 10; CHECK: remark: {{.*}} devirtualized vf1 11; CHECK: remark: {{.*}} devirtualized vf2 12 13@vt1 = constant [1 x ptr] [ptr @vf1], !type !0 14@vt2 = constant [1 x ptr] [ptr @vf2], !type !0 15 16define i32 @vf1(ptr %this) readnone { 17 ret i32 123 18} 19 20define i32 @vf2(ptr %this) readnone { 21 ret i32 123 22} 23 24; CHECK: define i32 @call 25define i32 @call(ptr %obj) { 26 %vtable = load ptr, ptr %obj 27 %p = call i1 @llvm.type.test(ptr %vtable, metadata !"typeid") 28 call void @llvm.assume(i1 %p) 29 %fptr = load ptr, ptr %vtable 30 %result = call i32 %fptr(ptr %obj) 31 ; CHECK-NOT: call i32 % 32 ; CHECK: ret i32 123 33 ret i32 %result 34} 35 36declare i1 @llvm.type.test(ptr, metadata) 37declare void @llvm.assume(i1) 38 39!0 = !{i32 0, !"typeid"} 40 41; CHECK: 2 wholeprogramdevirt - Number of whole program devirtualization targets 42; CHECK: 1 wholeprogramdevirt - Number of uniform return value optimizations 43