1b35b7da4SAndy Kaylor; RUN: opt < %s -passes=pgo-instr-gen -S | FileCheck %s --check-prefix=GEN 21ebee7adSHiroshi Yamauchi; RUN: opt < %s -passes=pgo-instr-gen,instrprof -S | FileCheck %s --check-prefixes=LOWER 3b35b7da4SAndy Kaylor 4b35b7da4SAndy Kaylor; This test is to verify that PGO runtime library calls get created with the 5b35b7da4SAndy Kaylor; appropriate operand bundle funclet information when a memory intrinsic 6b35b7da4SAndy Kaylor; being value profiled is called within an exception handler. 7b35b7da4SAndy Kaylor 8b35b7da4SAndy Kaylor; Test case based on this source: 9b35b7da4SAndy Kaylor; #include <memory.h> 10b35b7da4SAndy Kaylor; 11b35b7da4SAndy Kaylor; extern void may_throw(int); 12b35b7da4SAndy Kaylor; 13b35b7da4SAndy Kaylor; #define MSG "0123456789012345\0" 14b35b7da4SAndy Kaylor; unsigned len = 16; 15b35b7da4SAndy Kaylor; char msg[200]; 16b35b7da4SAndy Kaylor; 17b35b7da4SAndy Kaylor; void run(int count) { 18b35b7da4SAndy Kaylor; try { 19b35b7da4SAndy Kaylor; may_throw(count); 20b35b7da4SAndy Kaylor; } 21b35b7da4SAndy Kaylor; catch (...) { 22b35b7da4SAndy Kaylor; memcpy(msg, MSG, len); 23b35b7da4SAndy Kaylor; throw; 24b35b7da4SAndy Kaylor; } 25b35b7da4SAndy Kaylor; } 26b35b7da4SAndy Kaylor 27b35b7da4SAndy Kaylor%eh.ThrowInfo = type { i32, i32, i32, i32 } 28b35b7da4SAndy Kaylor 29b35b7da4SAndy Kaylor$"??_C@_0BC@CABPINND@Exception?5caught?$AA?$AA@" = comdat any 30b35b7da4SAndy Kaylor 31b35b7da4SAndy Kaylor@"?len@@3IA" = dso_local global i32 16, align 4 32b35b7da4SAndy Kaylor@"?msg@@3PADA" = dso_local global [200 x i8] zeroinitializer, align 16 33b35b7da4SAndy Kaylor@"??_C@_0BC@CABPINND@Exception?5caught?$AA?$AA@" = linkonce_odr dso_local unnamed_addr constant [18 x i8] c"0123456789012345\00\00", comdat, align 1 34b35b7da4SAndy Kaylor 35*9ff36df5SFangrui Songdefine dso_local void @"?run@@YAXH@Z"(i32 %count) personality ptr @__CxxFrameHandler3 { 36b35b7da4SAndy Kaylorentry: 37b35b7da4SAndy Kaylor invoke void @"?may_throw@@YAXH@Z"(i32 %count) 38b35b7da4SAndy Kaylor to label %try.cont unwind label %catch.dispatch 39b35b7da4SAndy Kaylor 40b35b7da4SAndy Kaylorcatch.dispatch: ; preds = %entry 41b35b7da4SAndy Kaylor %tmp = catchswitch within none [label %catch] unwind to caller 42b35b7da4SAndy Kaylor 43b35b7da4SAndy Kaylorcatch: ; preds = %catch.dispatch 44*9ff36df5SFangrui Song %tmp1 = catchpad within %tmp [ptr null, i32 64, ptr null] 45*9ff36df5SFangrui Song %tmp2 = load i32, ptr @"?len@@3IA", align 4 46b35b7da4SAndy Kaylor %conv = zext i32 %tmp2 to i64 47*9ff36df5SFangrui Song call void @llvm.memcpy.p0.p0.i64( 48*9ff36df5SFangrui Song ptr @"?msg@@3PADA", 49*9ff36df5SFangrui Song ptr @"??_C@_0BC@CABPINND@Exception?5caught?$AA?$AA@", 50b35b7da4SAndy Kaylor i64 %conv, i1 false) 51*9ff36df5SFangrui Song call void @_CxxThrowException(ptr null, ptr null) #3 [ "funclet"(token %tmp1) ] 52b35b7da4SAndy Kaylor unreachable 53b35b7da4SAndy Kaylor 54b35b7da4SAndy Kaylortry.cont: ; preds = %entry 55b35b7da4SAndy Kaylor ret void 56b35b7da4SAndy Kaylor} 57b35b7da4SAndy Kaylor 58b35b7da4SAndy Kaylor; GEN: catch: 59b35b7da4SAndy Kaylor; GEN: call void @llvm.instrprof.value.profile( 60b35b7da4SAndy Kaylor; GEN-SAME: [ "funclet"(token %tmp1) ] 61b35b7da4SAndy Kaylor 62b35b7da4SAndy Kaylor; LOWER: catch: 631ebee7adSHiroshi Yamauchi; LOWER: call void @__llvm_profile_instrument_memop( 64b35b7da4SAndy Kaylor; LOWER-SAME: [ "funclet"(token %tmp1) ] 65b35b7da4SAndy Kaylor 66b35b7da4SAndy Kaylordeclare dso_local void @"?may_throw@@YAXH@Z"(i32) 67b35b7da4SAndy Kaylordeclare dso_local i32 @__CxxFrameHandler3(...) 68b35b7da4SAndy Kaylor 69*9ff36df5SFangrui Songdeclare void @llvm.memcpy.p0.p0.i64(ptr, ptr, i64, i1) 70*9ff36df5SFangrui Songdeclare dso_local void @_CxxThrowException(ptr, ptr) 71