Files
clang-p2996/llvm/test/Transforms/SampleProfile/pseudo-probe-eh.ll
Hongtao Yu 950487bddf [Pseudo Probe] Do not instrument EH blocks.
This change avoids inserting probes to EH blocks. Pseudo probe can prevent block merging when probes in the blocks look different. This has a chained effect to passes incurring exponential IR growth (such as jump threading) and as a consequence the compilation may time out.  Not inserting probes to EH blocks could mitigate the issue. Another benefit is that both IR size and binary size are smaller. Since EH blocks are usually cold, the change should have minimal impact to profile quality.

Testing:

Out of two internal large benchmarks, no perf impact seen. 1% size savings to both the `text` and the `pseudo_probe` section.

Reviewed By: wenlei

Differential Revision: https://reviews.llvm.org/D142747
2023-01-30 13:26:56 -08:00

44 lines
1.2 KiB
LLVM

; REQUIRES: x86_64-linux
; RUN: opt < %s -passes=pseudo-probe -function-sections -S -o - | FileCheck %s
;; Check the generation of pseudoprobe intrinsic call for non-EH blocks only.
declare i32 @__gxx_personality_v0(...)
declare i32 @llvm.eh.typeid.for(ptr) nounwind
declare ptr @__cxa_begin_catch(ptr)
declare void @__cxa_end_catch()
declare void @bar()
@_ZTIi = external constant ptr
define void @foo() uwtable ssp personality ptr @__gxx_personality_v0 {
entry:
; CHECK: call void @llvm.pseudoprobe
invoke void @bar()
to label %ret unwind label %lpad
ret:
; CHECK: call void @llvm.pseudoprobe
ret void
lpad: ; preds = %entry
; CHECK-NOT: call void @llvm.pseudoprobe
%exn = landingpad {ptr, i32}
catch ptr @_ZTIi
%eh.exc = extractvalue { ptr, i32 } %exn, 0
%eh.selector = extractvalue { ptr, i32 } %exn, 1
%0 = call i32 @llvm.eh.typeid.for(ptr @_ZTIi) nounwind
%1 = icmp eq i32 %eh.selector, %0
br i1 %1, label %catch, label %eh.resume
catch:
; CHECK-NOT: call void @llvm.pseudoprobe
%ignored = call ptr @__cxa_begin_catch(ptr %eh.exc) nounwind
call void @__cxa_end_catch() nounwind
br label %ret
eh.resume:
; CHECK-NOT: call void @llvm.pseudoprobe
resume { ptr, i32 } %exn
}