<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/64197>64197</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[BFI][CGP] Assertion failed: (Match && "BFI mismatch"), function verifyMatch, file BlockFrequencyInfoImpl.h, line 1800.
</td>
</tr>
<tr>
<th>Labels</th>
<td>
llvm:crash,
llvm
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
hjyamauchi
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
PavelKopyl
</td>
</tr>
</table>
<pre>
Hello,
I faced with a failed assertion in BlockFrequencyInfoImpl on LLVM TOT.
Repro case: bfi-bug.ll
```
; Function Attrs: noreturn
define private fastcc void @__test() unnamed_addr #0 {
entry:
br i1 undef, label %join, label %division
division:
br label %join
join:
tail call fastcc void @encode(i32 1024)
unreachable
}
define private fastcc void @encode(i32 %0) unnamed_addr {
entry:
unreachable
}
attributes #0 = { noreturn }
```
LLVM should be built in the debug mode.
```
opt --codegenprepare --mtriple=riscv32 --cgp-verify-bfi-updates bfi-bug3.ll -S
Freq mismatch: entry 8 vs 16
This
block-frequency-info: __test
- entry: float = 1.0, int = 8
Other
block-frequency-info: __test
- entry: float = 1.0, int = 16
Assertion failed: (Match && "BFI mismatch"), function verifyMatch, file BlockFrequencyInfoImpl.h, line 1800.
```
Please, note that the actual triplet value doesn't seem to matter, as the failed assertion is in target-independent part of the code.
As I understand, the issues happens because the BFI updates are not synced with actual code transformations performed by CodeGenPrepare pass. Namely, the BBs frequency info, expressed as FrequencyData::Integer, is not updated.
Does it make sense to compare Scaled values instead?
```
--- a/llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h
+++ b/llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h
@@ -1777,7 +1777,7 @@ void BlockFrequencyInfoImpl<BT>::verifyMatch(
BlockNode OtherNode = OtherValidNodes[BB];
const auto &Freq = Freqs[Node.Index];
const auto &OtherFreq = Other.Freqs[OtherNode.Index];
- if (Freq.Integer != OtherFreq.Integer) {
+ if (Freq.Scaled != OtherFreq.Scaled) {
Match = false;
dbgs() << "Freq mismatch: " << bfi_detail::getBlockName(BB) << " "
<< Freq.Integer << " vs " << OtherFreq.Integer << "\n";
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEVl1zozoS_TXySxcUCOOPBz8EvJ517XykdlLzmhKoMZoREisJ7_jf35IAJ44z996Hqboux0FCfdR9-nRLzFpxUog7kheE0vb7hXVsqFtBKCX5fsEG12qze2RnlP_R_UUuKs0vu3-jlJrQkiR7kjyMv0doWI0c_i9cCwwaJiRyYNaicUIrEAoKqesfB4P_G1DVl6Nq9LHrJWgFHz9--wRPX57i14j_xd5oqJlFkj1A1YioGk6xlNOaVTJ9x2FWwGFQddjrwTljvZHSBt1g1LiGYyMUQm_EmTmEhllX13DWggNZJs_PDq0jdEPoFgalWIf8mXFugNAsAbIuRhRUzlxINjkJUBkQKQyKY0NoCZJVKIHQ_LsW6maCi7OwQk_OwOTTPHkDeAvyen2YeFnrmJBQMynfRoOq1hwJ3YiMQprQJaHb2WhQBlndskriRN56f-vUnxJ1A01ontwT9iuu_nJn5pwR1eDQTqxne492TSRcDd7mP_wGHdlWD5JDhVANQjqvPNcicKyGE3SaY_wugu4dRJEP7YSqN9gzgxBFnTOil0iyvRG2PmfULzr10RmNaC6Rl-XQc-Y9niSaxVJC9HVE9XKHTtiOubr1kgyUwAbOFtLVuOapFXZ8qnyFRM1cIpFQjfZGkzZHpiKYaYVGauYCSWmceLEJNQ43r1n54lo0v3mD2ffx9-Fa5mPde1NCN5980EDoitAVEEqLw_GFC0q9JGkJzVy2I6WfxrclNELiL3pGHBZIL9J0kyTvJ_RRou8dtASlHYJrmQtCYLUbmIQxrw7OTA4IXKNVhK4dWMQOnIaOOYfGmzMb7O5bmg3aYuaELhKKY4-Ko3LQM-NAN8HKCyqGW7LgGPqFsY4p7nfwC4W1A1poWd-jslBhzQaL4ZXnbRaZV6XSDuxFvbTbMSK_FTjDlG206Zj30UKPxo-QQ3WBUnP8gOpxUnfPrI3hM-tQXmY3isLCVR8Q9EFLwJ-9QWtD-HBNx5455qs7ezgqh6eRLWGDf6O__Db0vUYLwkHHfiBYVD4-DbXugjtfa-YJDgnx1FqHjJPs8G52oygCRuhBynNH6EGoWg6-K80TD4rJixWW0MMvNTTi0mL8QvVb4JYJWSYQpev1mtByDYQWL8_jy9BJ34chWVk8kexfI603FbGZu-j0CQCffc5DgYcnX5ph9I1Jwf2UJXlRFCTfk6x4A1BrZR2wwWlfo6FTeXv_4K28dXxUHH_-Deuw6RUijOIZ6OrePVo0o4nGNwxvEU9aAkLTK9brF_64uZ4wPm_3EJOS7hDG-RsAmJpUtoeGSX_XeBsoAK9OdroYkKwkWemb2V1nJ5TOr6tGPHP0h_OYxxO6MVus8wdnUdxC-b-7TafPtOqWmRfLs3297x1Xr5aSvFT-3xzfuwfogu8yvs22bIG7dLVN8uVqmy0X7Y5znmJOsxyXbLPK-bJJ82azTOiy3labarMQO5rQLFnTTUopTbO4Rl6nTV4nnGK1xqW_OXRMyNhXVKzNaRE63m61TLfrRbjx2OkeGmoue6gNs-M5Uc6T47XU7PzAn7WWLBMprLMvqE44iTvwsj8cvdbyovzwSPI9_NOn1GIwctc61_u7KaEHQg8n4dqhimvdvbSaEFtv9HesnW9F4Vwg9BCI-iMAAP__R2KJ6w">