Files
clang-p2996/llvm/test/Transforms/LowerExpectIntrinsic/expect_nonboolean.ll
Paul Kirth 294f3ce5dd Reapply "[llvm][IR] Extend BranchWeightMetadata to track provenance o… (#95281)
…f weights" #95136

Reverts #95060, and relands #86609, with the unintended code generation
changes addressed.

This patch implements the changes to LLVM IR discussed in
https://discourse.llvm.org/t/rfc-update-branch-weights-metadata-to-allow-tracking-branch-weight-origins/75032

In this patch, we add an optional field to MD_prof meatdata nodes for
branch weights, which can be used to distinguish weights added from
llvm.expect* intrinsics from those added via other methods, e.g. from
profiles or inserted by the compiler.

One of the major motivations, is for use with MisExpect diagnostics,
which need to know if branch_weight metadata originates from an
llvm.expect intrinsic. Without that information, we end up checking
branch weights multiple times in the case if ThinLTO + SampleProfiling,
leading to some inaccuracy in how we report MisExpect related
diagnostics to users.

Since we change the format of MD_prof metadata in a fundamental way, we
need to update code handling branch weights in a number of places.

We also update the lang ref for branch weights to reflect the change.
2024-06-12 12:52:28 -07:00

104 lines
2.8 KiB
LLVM

; RUN: opt -passes=lower-expect -S -o - < %s | FileCheck %s
; RUN: opt -S -passes='function(lower-expect)' < %s | FileCheck %s
define i32 @foo(i32 %arg) #0 {
; CHECK-LABEL: @foo(i32{{.*}})
bb:
%tmp = sext i32 %arg to i64
%tmp1 = call i64 @llvm.expect.i64(i64 %tmp, i64 4)
%tmp2 = icmp ne i64 %tmp1, 0
br i1 %tmp2, label %bb3, label %bb5
; CHECK: br i1 %tmp2{{.*}}!prof [[LIKELY:![0-9]+]]
bb3: ; preds = %bb
%tmp4 = call i32 (...) @bar()
br label %bb5
bb5: ; preds = %bb3, %bb
ret i32 1
}
define i32 @foo2(i32 %arg) #0 {
; CHECK-LABEL: @foo2
bb:
%tmp = sext i32 %arg to i64
%tmp1 = call i64 @llvm.expect.i64(i64 %tmp, i64 4)
%tmp2 = icmp eq i64 %tmp1, 2
br i1 %tmp2, label %bb3, label %bb5
; CHECK: br i1 %tmp2{{.*}}!prof [[UNLIKELY:![0-9]+]]
bb3: ; preds = %bb
%tmp4 = call i32 (...) @bar()
br label %bb5
bb5: ; preds = %bb3, %bb
ret i32 1
}
define i32 @foo3(i32 %arg) #0 {
; CHECK-LABEL: @foo3
bb:
%tmp = sext i32 %arg to i64
%tmp1 = call i64 @llvm.expect.i64(i64 %tmp, i64 4)
%tmp2 = icmp eq i64 %tmp1, 4
br i1 %tmp2, label %bb3, label %bb5
; CHECK: br i1 %tmp2{{.*}}!prof [[LIKELY]]
bb3: ; preds = %bb
%tmp4 = call i32 (...) @bar()
br label %bb5
bb5: ; preds = %bb3, %bb
ret i32 1
}
define i32 @foo4(i32 %arg) #0 {
; CHECK-LABEL: @foo4
bb:
%tmp = sext i32 %arg to i64
%tmp1 = call i64 @llvm.expect.i64(i64 %tmp, i64 4)
%tmp2 = icmp ne i64 %tmp1, 2
br i1 %tmp2, label %bb3, label %bb5
; CHECK: br i1 %tmp2{{.*}}!prof [[LIKELY]]
bb3: ; preds = %bb
%tmp4 = call i32 (...) @bar()
br label %bb5
bb5: ; preds = %bb3, %bb
ret i32 1
}
define i32 @foo5(i32 %arg, i32 %arg1) #0 {
; CHECK-LABEL: @foo5
bb:
%tmp = sext i32 %arg1 to i64
%tmp2 = call i64 @llvm.expect.i64(i64 %tmp, i64 4)
%tmp3 = sext i32 %arg to i64
%tmp4 = icmp ne i64 %tmp2, %tmp3
br i1 %tmp4, label %bb5, label %bb7
; CHECK-NOT: !prof
bb5: ; preds = %bb
%tmp6 = call i32 (...) @bar()
br label %bb7
bb7: ; preds = %bb5, %bb
ret i32 1
}
declare i64 @llvm.expect.i64(i64, i64) #1
declare i32 @bar(...) local_unnamed_addr #0
attributes #0 = { nounwind uwtable }
attributes #1 = { nounwind readnone }
!llvm.module.flags = !{!0}
!llvm.ident = !{!1}
!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{!"clang version 5.0.0 (trunk 304373)"}
; CHECK: [[LIKELY]] = !{!"branch_weights", !"expected", i32 2000, i32 1}
; CHECK: [[UNLIKELY]] = !{!"branch_weights", !"expected", i32 1, i32 2000}