Skip to content

Commit 62f8281

Browse files
authored
[IR][PGO] Verify invalid MD_prof metadata on instructions (#145576)
This PR places the validation of `MD_prof` instruction metadata in the Verifier.
1 parent fcbfff1 commit 62f8281

File tree

4 files changed

+47
-55
lines changed

4 files changed

+47
-55
lines changed

llvm/lib/IR/Verifier.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5026,6 +5026,9 @@ void Verifier::visitProfMetadata(Instruction &I, MDNode *MD) {
50265026
Check(mdconst::dyn_extract<ConstantInt>(MDO),
50275027
"!prof brunch_weights operand is not a const int");
50285028
}
5029+
} else {
5030+
Check(ProfName == "VP", "expected either branch_weights or VP profile name",
5031+
MD);
50295032
}
50305033
}
50315034

llvm/test/Transforms/SimplifyCFG/preserve-branchweights.ll

Lines changed: 5 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -38,45 +38,12 @@ Z:
3838
ret void
3939
}
4040

41-
; Make sure the metadata name string is "branch_weights" before propagating it.
42-
43-
define void @fake_weights(i1 %a, i1 %b) {
44-
; CHECK-LABEL: @fake_weights(
45-
; CHECK-NEXT: entry:
46-
; CHECK-NEXT: [[A_NOT:%.*]] = xor i1 [[A:%.*]], true
47-
; CHECK-NEXT: [[C:%.*]] = or i1 [[B:%.*]], false
48-
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[A_NOT]], i1 [[C]], i1 false
49-
; CHECK-NEXT: br i1 [[OR_COND]], label [[Z:%.*]], label [[Y:%.*]], !prof [[PROF1:![0-9]+]]
50-
; CHECK: common.ret:
51-
; CHECK-NEXT: ret void
52-
; CHECK: Y:
53-
; CHECK-NEXT: call void @helper(i32 0)
54-
; CHECK-NEXT: br label [[COMMON_RET:%.*]]
55-
; CHECK: Z:
56-
; CHECK-NEXT: call void @helper(i32 1)
57-
; CHECK-NEXT: br label [[COMMON_RET]]
58-
;
59-
entry:
60-
br i1 %a, label %Y, label %X, !prof !12
61-
X:
62-
%c = or i1 %b, false
63-
br i1 %c, label %Z, label %Y, !prof !1
64-
65-
Y:
66-
call void @helper(i32 0)
67-
ret void
68-
69-
Z:
70-
call void @helper(i32 1)
71-
ret void
72-
}
73-
7441
define void @test2(i1 %a, i1 %b) {
7542
; CHECK-LABEL: @test2(
7643
; CHECK-NEXT: entry:
7744
; CHECK-NEXT: [[C:%.*]] = or i1 [[B:%.*]], false
7845
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[A:%.*]], i1 [[C]], i1 false
79-
; CHECK-NEXT: br i1 [[OR_COND]], label [[Z:%.*]], label [[Y:%.*]], !prof [[PROF2:![0-9]+]]
46+
; CHECK-NEXT: br i1 [[OR_COND]], label [[Z:%.*]], label [[Y:%.*]], !prof [[PROF1:![0-9]+]]
8047
; CHECK: common.ret:
8148
; CHECK-NEXT: ret void
8249
; CHECK: Y:
@@ -107,7 +74,7 @@ define void @test3(i1 %a, i1 %b) {
10774
; CHECK-NEXT: entry:
10875
; CHECK-NEXT: [[C:%.*]] = or i1 [[B:%.*]], false
10976
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[A:%.*]], i1 [[C]], i1 false
110-
; CHECK-NEXT: br i1 [[OR_COND]], label [[Z:%.*]], label [[Y:%.*]], !prof [[PROF1]]
77+
; CHECK-NEXT: br i1 [[OR_COND]], label [[Z:%.*]], label [[Y:%.*]], !prof [[PROF2:![0-9]+]]
11178
; CHECK: common.ret:
11279
; CHECK-NEXT: ret void
11380
; CHECK: Y:
@@ -138,7 +105,7 @@ define void @test4(i1 %a, i1 %b) {
138105
; CHECK-NEXT: entry:
139106
; CHECK-NEXT: [[C:%.*]] = or i1 [[B:%.*]], false
140107
; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[A:%.*]], i1 [[C]], i1 false
141-
; CHECK-NEXT: br i1 [[OR_COND]], label [[Z:%.*]], label [[Y:%.*]], !prof [[PROF1]]
108+
; CHECK-NEXT: br i1 [[OR_COND]], label [[Z:%.*]], label [[Y:%.*]], !prof [[PROF2]]
142109
; CHECK: common.ret:
143110
; CHECK-NEXT: ret void
144111
; CHECK: Y:
@@ -1120,7 +1087,6 @@ exit:
11201087
!9 = !{!"branch_weights", i32 7, i32 6}
11211088
!10 = !{!"branch_weights", i32 672646, i32 21604207}
11221089
!11 = !{!"branch_weights", i32 6960, i32 21597248}
1123-
!12 = !{!"these_are_not_the_branch_weights_you_are_looking_for", i32 3, i32 5}
11241090
!13 = !{!"branch_weights", i32 2, i32 3}
11251091
!14 = !{!"branch_weights", i32 4, i32 7}
11261092
!15 = !{!"branch_weights", i32 99, i32 1}
@@ -1136,8 +1102,8 @@ exit:
11361102
; CHECK: attributes #[[ATTR2:[0-9]+]] = { noredzone nounwind ssp memory(none) }
11371103
;.
11381104
; CHECK: [[PROF0]] = !{!"branch_weights", i32 5, i32 11}
1139-
; CHECK: [[PROF1]] = !{!"branch_weights", i32 1, i32 3}
1140-
; CHECK: [[PROF2]] = !{!"branch_weights", i32 1, i32 5}
1105+
; CHECK: [[PROF1]] = !{!"branch_weights", i32 1, i32 5}
1106+
; CHECK: [[PROF2]] = !{!"branch_weights", i32 1, i32 3}
11411107
; CHECK: [[PROF3]] = !{!"branch_weights", i32 7, i32 1, i32 2}
11421108
; CHECK: [[PROF4]] = !{!"branch_weights", i32 49, i32 12, i32 24, i32 35}
11431109
; CHECK: [[PROF5]] = !{!"branch_weights", i32 11, i32 5}

llvm/test/Verifier/branch-weight.ll

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
; Test MD_prof validation
2+
3+
; RUN: split-file %s %t
4+
; RUN: opt -passes=verify %t/valid.ll --disable-output
5+
; RUN: not opt -passes=verify %t/invalid1.ll --disable-output 2>&1 | FileCheck %s
6+
; RUN: not opt -passes=verify %t/invalid2.ll --disable-output 2>&1 | FileCheck %s
7+
8+
;--- valid.ll
9+
define void @test(i1 %0) {
10+
br i1 %0, label %2, label %3, !prof !0
11+
2:
12+
ret void
13+
3:
14+
ret void
15+
}
16+
!0 = !{!"branch_weights", i32 1, i32 2}
17+
18+
;--- invalid1.ll
19+
define void @test(i1 %0) {
20+
br i1 %0, label %2, label %3, !prof !0
21+
2:
22+
ret void
23+
3:
24+
ret void
25+
}
26+
!0 = !{!"invalid", i32 1, i32 2}
27+
28+
;--- invalid2.ll
29+
define void @test(i1 %0) {
30+
br i1 %0, label %2, label %3, !prof !0
31+
2:
32+
ret void
33+
3:
34+
ret void
35+
}
36+
37+
!0 = !{!"function_entry_count", i32 1}
38+
39+
; CHECK: expected either branch_weights or VP profile name

mlir/test/Target/LLVMIR/Import/import-failure.ll

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -258,22 +258,6 @@ end:
258258

259259
; // -----
260260

261-
; CHECK: <unknown>
262-
; CHECK-SAME: warning: expected function_entry_count to be attached to a function
263-
; CHECK: warning: unhandled metadata: !0 = !{!"function_entry_count", i64 42}
264-
define void @cond_br(i1 %arg) {
265-
entry:
266-
br i1 %arg, label %bb1, label %bb2, !prof !0
267-
bb1:
268-
ret void
269-
bb2:
270-
ret void
271-
}
272-
273-
!0 = !{!"function_entry_count", i64 42}
274-
275-
; // -----
276-
277261
; CHECK: <unknown>
278262
; CHECK-SAME: warning: dropped instruction: call void @llvm.experimental.noalias.scope.decl(metadata !0)
279263
define void @unused_scope() {

0 commit comments

Comments
 (0)