[PGO] Include the mem ops into the function hash.

To avoid hash collisions when the only difference is in mem ops.

Differential Revision: https://reviews.llvm.org/D84782
This commit is contained in:
Hiroshi Yamauchi 2020-07-28 10:09:49 -07:00
parent 01aa14784b
commit 120e66b341
50 changed files with 144 additions and 80 deletions

View File

@ -2,7 +2,7 @@
:ir
foo
# Func Hash:
25571299074
784007059655560962
# Num Counters:
2
# Counter Values:

View File

@ -2,7 +2,7 @@
:csir
foo
# Func Hash:
25571299074
784007059655560962
# Num Counters:
2
# Counter Values:
@ -11,7 +11,7 @@ foo
foo
# Func Hash:
1152921530178146050
1936928564262407938
# Num Counters:
2
# Counter Values:

View File

@ -1,6 +1,6 @@
:ir
_ZN3Foo8functionENS_1XE
29667547796
146835647075900052
2
10
90

View File

@ -1,7 +1,7 @@
:ir
:entry_first
_ZN3Foo8functionENS_1XE
29667547796
146835647075900052
2
100
90

View File

@ -2,7 +2,7 @@
:ir
main
# Func Hash:
34137660316
1063705162469825436
# Num Counters:
2
# Counter Values:

View File

@ -3,7 +3,7 @@
:entry_first
main
# Func Hash:
34137660316
1063705162469825436
# Num Counters:
2
# Counter Values:

View File

@ -45,7 +45,7 @@ int main(int argc, char *argv[]) {
// CHECK: Counters:
// CHECK: main:
// CHECK: Hash: 0x00030012a7ab6e87
// CHECK: Hash: 0x0a9bd81e87ab6e87
// CHECK: Counters: 6
// CHECK: Indirect Call Site Count: 3
// CHECK: Number of Memory Intrinsics Calls: 3

View File

@ -261,6 +261,10 @@ extern cl::opt<PGOViewCountsType> PGOViewCounts;
// Defined in Analysis/BlockFrequencyInfo.cpp: -view-bfi-func-name=
extern cl::opt<std::string> ViewBlockFreqFuncName;
static cl::opt<bool>
PGOOldCFGHashing("pgo-instr-old-cfg-hashing", cl::init(false), cl::Hidden,
cl::desc("Use the old CFG function hashing"));
// Return a string describing the branch condition that can be
// used in static branch probability heuristics:
static std::string getBranchCondString(Instruction *TI) {
@ -620,7 +624,8 @@ public:
} // end anonymous namespace
// Compute Hash value for the CFG: the lower 32 bits are CRC32 of the index
// value of each BB in the CFG. The higher 32 bits record the number of edges.
// value of each BB in the CFG. The higher 32 bits are the CRC32 of the numbers
// of selects, indirect calls, mem ops and edges.
template <class Edge, class BBInfo>
void FuncPGOInstrumentation<Edge, BBInfo>::computeCFGHash() {
std::vector<uint8_t> Indexes;
@ -639,12 +644,34 @@ void FuncPGOInstrumentation<Edge, BBInfo>::computeCFGHash() {
}
JC.update(Indexes);
// Hash format for context sensitive profile. Reserve 4 bits for other
// information.
FunctionHash = (uint64_t)SIVisitor.getNumOfSelectInsts() << 56 |
(uint64_t)ValueSites[IPVK_IndirectCallTarget].size() << 48 |
//(uint64_t)ValueSites[IPVK_MemOPSize].size() << 40 |
(uint64_t)MST.AllEdges.size() << 32 | JC.getCRC();
JamCRC JCH;
if (PGOOldCFGHashing) {
// Hash format for context sensitive profile. Reserve 4 bits for other
// information.
FunctionHash = (uint64_t)SIVisitor.getNumOfSelectInsts() << 56 |
(uint64_t)ValueSites[IPVK_IndirectCallTarget].size() << 48 |
//(uint64_t)ValueSites[IPVK_MemOPSize].size() << 40 |
(uint64_t)MST.AllEdges.size() << 32 | JC.getCRC();
} else {
// The higher 32 bits.
union {
uint64_t N;
uint8_t C[8];
} Data;
Data.N = (uint64_t)SIVisitor.getNumOfSelectInsts();
JCH.update(Data.C);
Data.N = (uint64_t)ValueSites[IPVK_IndirectCallTarget].size();
JCH.update(Data.C);
Data.N = (uint64_t)ValueSites[IPVK_MemOPSize].size();
JCH.update(Data.C);
Data.N = (uint64_t)MST.AllEdges.size();
JCH.update(Data.C);
// Hash format for context sensitive profile. Reserve 4 bits for other
// information.
FunctionHash = (((uint64_t)JCH.getCRC()) << 28) + JC.getCRC();
}
// Reserve bit 60-63 for other information purpose.
FunctionHash &= 0x0FFFFFFFFFFFFFFF;
if (IsCS)
@ -653,8 +680,12 @@ void FuncPGOInstrumentation<Edge, BBInfo>::computeCFGHash() {
<< " CRC = " << JC.getCRC()
<< ", Selects = " << SIVisitor.getNumOfSelectInsts()
<< ", Edges = " << MST.AllEdges.size() << ", ICSites = "
<< ValueSites[IPVK_IndirectCallTarget].size()
<< ", Hash = " << FunctionHash << "\n";);
<< ValueSites[IPVK_IndirectCallTarget].size());
if (!PGOOldCFGHashing) {
LLVM_DEBUG(dbgs() << ", Memops = " << ValueSites[IPVK_MemOPSize].size()
<< ", High32 CRC = " << JCH.getCRC());
}
LLVM_DEBUG(dbgs() << ", Hash = " << FunctionHash << "\n";);
}
// Check if we can safely rename this Comdat function.

View File

@ -1,6 +1,6 @@
:ir
foo
60927483247
1096621588030135663
4
3
2

View File

@ -1,6 +1,6 @@
:ir
f
62077759478
1096621589180411894
2
3
2

View File

@ -1,7 +1,7 @@
# :ir is the flag to indicate this is IR level profile.
:ir
test_br_1
25571299074
784007059655560962
2
3
2

View File

@ -1,7 +1,7 @@
# :ir is the flag to indicate this is IR level profile.
:ir
test_br_1
25571299074
784007059655560962
2
12884901888
8589934592

View File

@ -1,7 +1,7 @@
# :ir is the flag to indicate this is IR level profile.
:ir
test_br_2
29667547796
146835647075900052
2
1
1

View File

@ -2,7 +2,7 @@
:ir
:entry_first
test_br_2
29667547796
146835647075900052
2
2
1

View File

@ -1,7 +1,7 @@
# :ir is the flag to indicate this is IR level profile.
:ir
test_criticalEdge
82323253069
93478046750287693
8
2
1
@ -13,7 +13,7 @@ test_criticalEdge
1
<stdin>:bar
12884901887
742261418966908927
1
7

View File

@ -2,7 +2,7 @@
:ir
:entry_first
test_criticalEdge
82323253069
93478046750287693
8
7
2
@ -14,7 +14,7 @@ test_criticalEdge
1
<stdin>:bar
12884901887
742261418966908927
1
7

View File

@ -54,7 +54,7 @@ bar_m2
foo
# Func Hash:
1152921640672869708
1456607294772657484
# Num Counters:
10
# Counter Values:
@ -71,7 +71,7 @@ foo
foo
# Func Hash:
29212902728
146835646621254984
# Num Counters:
2
# Counter Values:
@ -80,7 +80,7 @@ foo
bar
# Func Hash:
1152921569533132113
1440408129826749777
# Num Counters:
5
# Counter Values:
@ -92,7 +92,7 @@ bar
bar
# Func Hash:
56228292833
567185239050791137
# Num Counters:
4
# Counter Values:
@ -103,7 +103,7 @@ bar
main
# Func Hash:
1152921517491748863
1895182923573755903
# Num Counters:
1
# Counter Values:
@ -111,7 +111,7 @@ main
main
# Func Hash:
12884901887
742261418966908927
# Num Counters:
1
# Counter Values:
@ -135,7 +135,7 @@ csfdo_plain.c:barbar
goo
# Func Hash:
1152921517491748863
1895182923573755903
# Num Counters:
1
# Counter Values:
@ -143,7 +143,7 @@ goo
goo
# Func Hash:
12884901887
742261418966908927
# Num Counters:
1
# Counter Values:

View File

@ -1,6 +1,6 @@
# :ir is the flag to indicate this is IR level profile.
:ir
foo
12884901887
48277136972185599
1
1

View File

@ -1,7 +1,7 @@
:ir
:entry_first
test_simple_for
34137660316
1063705162469825436
2
0
96

View File

@ -3,7 +3,7 @@
:entry_first
hot
# Func Hash:
12884901887
742261418966908927
# Num Counters:
1
# Counter Values:
@ -11,7 +11,7 @@ hot
cold
# Func Hash:
12884901887
742261418966908927
# Num Counters:
1
# Counter Values:
@ -19,7 +19,7 @@ cold
med
# Func Hash:
12884901887
742261418966908927
# Num Counters:
1
# Counter Values:

View File

@ -1,7 +1,7 @@
:ir
bar
# Func Hash:
281487861612543
170957022131388415
# Num Counters:
1
# Counter Values:
@ -19,7 +19,7 @@ func3:20
func1
# Func Hash:
12884901887
742261418966908927
# Num Counters:
1
# Counter Values:
@ -27,7 +27,7 @@ func1
func2
# Func Hash:
12884901887
742261418966908927
# Num Counters:
1
# Counter Values:
@ -35,7 +35,7 @@ func2
func3
# Func Hash:
12884901887
742261418966908927
# Num Counters:
1
# Counter Values:

View File

@ -2,7 +2,7 @@
:ir
foo
# Func Hash:
47485104005
844982796158316421
# Num Counters:
4
# Counter Values:

View File

@ -3,7 +3,7 @@
:entry_first
foo
# Func Hash:
47485104005
844982796158316421
# Num Counters:
4
# Counter Values:

View File

@ -1,7 +1,7 @@
:ir
_Z11irreducibleii
# Func Hash:
64451410787
287486624745028451
# Num Counters:
6
# Counter Values:
@ -14,7 +14,7 @@ _Z11irreducibleii
_Z11irreduciblePh
# Func Hash:
104649601521
331779889035882993
# Num Counters:
9
# Counter Values:

View File

@ -2,7 +2,7 @@
:entry_first
_Z11irreducibleii
# Func Hash:
64451410787
287486624745028451
# Num Counters:
6
# Counter Values:
@ -15,7 +15,7 @@ _Z11irreducibleii
_Z11irreduciblePh
# Func Hash:
104649601521
331779889035882993
# Num Counters:
9
# Counter Values:

View File

@ -1,7 +1,7 @@
# :ir is the flag to indicate this is IR level profile.
:ir
foo
59130013419
567185241952511723
4
3
1
@ -9,7 +9,7 @@ foo
0
bar
24868915205
784007058953177093
2
3
2

View File

@ -2,7 +2,7 @@
:ir
:entry_first
foo
59130013419
567185241952511723
4
5
1
@ -10,7 +10,7 @@ foo
0
bar
24868915205
784007058953177093
2
3
2

View File

@ -1,7 +1,7 @@
# :ir is the flag to indicate this is IR level profile.
:ir
test
25571299074
784007059655560962
2
40000000000
20000000000

View File

@ -1,7 +1,7 @@
# :ir is the flag to indicate this is IR level profile.
:ir
test_simple_for
34137660316
1063705162469825436
2
96
4

View File

@ -2,7 +2,7 @@
:ir
:entry_first
test_simple_for
34137660316
1063705162469825436
2
4
96

View File

@ -1,7 +1,7 @@
# :ir is the flag to indicate this is IR level profile.
:ir
test_nested_for
53929068288
798733566382720768
3
33
10

View File

@ -2,7 +2,7 @@
:ir
:entry_first
test_nested_for
53929068288
798733566382720768
3
6
33

View File

@ -2,7 +2,7 @@
:ir
foo
# Func Hash:
53929068288
687116424982578944
# Num Counters:
3
# Counter Values:

View File

@ -2,7 +2,7 @@
:ir
bar
# Func Hash:
29667547796
146835647075900052
# Num Counters:
2
# Counter Values:

View File

@ -2,7 +2,7 @@
:ir
bar
# Func Hash:
29667547796
146835647075900052
# Num Counters:
2
# Counter Values:

View File

@ -3,7 +3,7 @@
:entry_first
bar
# Func Hash:
29667547796
146835647075900052
# Num Counters:
2
# Counter Values:

View File

@ -2,7 +2,7 @@
:ir
main
# Func Hash:
74054140268
391331300939170156
# Num Counters:
7
# Counter Values:

View File

@ -3,7 +3,7 @@
:entry_first
main
# Func Hash:
74054140268
391331300939170156
# Num Counters:
7
# Counter Values:

View File

@ -2,7 +2,7 @@
:ir
main
# Func Hash:
74054140268
391331300939170156
# Num Counters:
7
# Counter Values:

View File

@ -3,7 +3,7 @@
:entry_first
main
# Func Hash:
74054140268
391331300939170156
# Num Counters:
7
# Counter Values:

View File

@ -2,12 +2,22 @@
:ir
_Z3fooi
# Func Hash:
382993475055910911
# Num Counters:
2
# Counter Values:
18
12
# For -pgo-instr-old-cfg-hashing=true
_Z3fooi
# Func Hash:
72057606922829823
# Num Counters:
2
# Counter Values:
18
12
6
_Z3fooi
# Func Hash:
@ -17,6 +27,16 @@ _Z3fooi
# Counter Values:
0
_Z3bari
# Func Hash:
382993475055910911
# Num Counters:
2
# Counter Values:
0
0
# For -pgo-instr-old-cfg-hashing=true
_Z3bari
# Func Hash:
72057606922829823
@ -28,9 +48,17 @@ _Z3bari
_Z4m2f1v
# Func Hash:
12884901887
742261418966908927
# Num Counters:
1
# Counter Values:
1
# For -pgo-instr-old-cfg-hashing=true
_Z4m2f1v
# Func Hash:
12884901887
# Num Counters:
1
# Counter Values:
1

View File

@ -2,7 +2,7 @@
:ir
foo
# Func Hash:
36496524737
238984482720105921
# Num Counters:
3
# Counter Values:

View File

@ -1,7 +1,7 @@
# :ir is the flag to indicate this is IR level profile.
:ir
_ZN3foo3barERKN1N1XINS_4quuxEEE
25571299074
784007059655560962
2
3
2

View File

@ -1,7 +1,7 @@
:ir
:entry_first
test_br_2
72057623705475732
942389667449461396
3
5
1

View File

@ -3,7 +3,7 @@
:entry_first
foo
# Func Hash:
72057628175588252
134732432632142748
# Num Counters:
3
# Counter Values:

View File

@ -1,7 +1,7 @@
# :ir is the flag to indicate this is IR level profile.
:ir
test_simple_for
34137660316
1063705162469825436
2
0
0

View File

@ -1,7 +1,7 @@
# :ir is the flag to indicate this is IR level profile.
:ir
test_switch
46200943743
536873293052540031
4
0
5

View File

@ -2,7 +2,7 @@
:ir
:entry_first
test_switch
46200943743
536873293052540031
4
10
5

View File

@ -10,7 +10,7 @@ cond.llvm.11253644763537639171
foo
# Func Hash:
29212902728
1720106746050921044
# Num Counters:
2
# Counter Values:
@ -19,7 +19,7 @@ foo
bar
# Func Hash:
1152921534274394772
1299757151682747028
# Num Counters:
2
# Counter Values:
@ -45,7 +45,7 @@ main
main
# Func Hash:
12884901887
1895182923573755903
# Num Counters:
1
# Counter Values:
@ -53,7 +53,7 @@ main
cspgo.c:foo
# Func Hash:
1152921563228422740
1720106746050921044
# Num Counters:
4
# Counter Values:

View File

@ -1,6 +1,8 @@
; RUN: llvm-profdata merge %S/Inputs/multiple_hash_profile.proftext -o %t.profdata
; RUN: opt < %s -pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s
; RUN: opt < %s -pgo-instr-use -pgo-test-profile-file=%t.profdata -pgo-instr-old-cfg-hashing=true -S | FileCheck -check-prefix=CHECKOLDHASH %s
; RUN: opt < %s -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s
; RUN: opt < %s -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -pgo-instr-old-cfg-hashing=true -S | FileCheck -check-prefix=CHECKOLDHASH %s
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@ -29,6 +31,9 @@ entry:
; CHECK: %mul.i = select i1 %cmp.i, i32 1, i32 %i
; CHECK-SAME: !prof ![[BW:[0-9]+]]
; CHECK: ![[BW]] = !{!"branch_weights", i32 12, i32 6}
; CHECKOLDHASH: %mul.i = select i1 %cmp.i, i32 1, i32 %i
; CHECKOLDHASH-SAME: !prof ![[BW:[0-9]+]]
; CHECKOLDHASH: ![[BW]] = !{!"branch_weights", i32 6, i32 12}
%retval.0.i = mul nsw i32 %mul.i, %i
ret i32 %retval.0.i
}