CMake -DLLVM_ENABLE_REVERSE_ITERATION=on
makes some LLVM containers (currently DenseMap
(DenseSet
) and StringMap
(StringSet
) (since D155789) to be iterated in a reversed order[1]. This is a good way to prevent reliance on the unspecified iteration order [2].
for (auto x : aStringMap) {
// do something that is sensitive to the order. // bad pattern
}
Currently there is one builder reverse-iteration
(maintained by @mgrang, thanks!) that checks these subprojects llvm;clang;polly
.
I wonder whether we can have -DLLVM_ENABLE_REVERSE_ITERATION=on
coverage for lld;flang;lldb;bolt;mlir
. This will require adding -DLLVM_ENABLE_REVERSE_ITERATION=on
to certain builders (buildbot/osuosl/master/config/builders.py
?).
Unlike -DLLVM_ENABLE_EXPENSIVE_CHECKS=ON
, -DLLVM_ENABLE_REVERSE_ITERATION=on
has no performance overhead.
BTW, -DLLVM_ENABLE_REVERSE_ITERATION=on
and -DLLVM_REVERSE_ITERATION=on
have the same effect. I wonder whether we should converge to one spelling. LLVM_ENABLE_REVERSE_ITERATION
is also a C++ macro name, so I personally prefer -DLLVM_ENABLE_REVERSE_ITERATION=on
more.
[1]: StringMap
is not completely reversely iterated. For simplicity we just apply bitwise NOT to the hash value. To change xxHash64
(xxh64) to xxh3_64bits
for StringMap
, I have fixed ~20 bugs in llvm;clang;lld/wasm;lldb;flang
.
[2]: https://llvm.org/docs/ProgrammersManual.html even says that the order can be non-deterministic.
1 Like
maintained by @mgrang, thanks
The bot is maintained by Qualcomm. @mgrang is no longer working at Qualcomm, so he can’t help you with the bot.
Not sure how much spare capacity we have on the hexagon-build-02/03 bots, but getting coverage for flang and lld would be useful for us. If you post a patch for the reverse-iteration config, I’ll help get it reviewed. (buildbot/osuosl/master/config/builders.py is the right path.)
Thank you! If the capacity is a problem, I am wondering whether we can get the coverage for mlir/flang by adding -DLLVM_ENABLE_REVERSE_ITERATION=on
to some other builders.
For example, there are multiple builders named flang-aarch64-*
on linaro-*
workers (@DavidSpickett). We can add -DLLVM_ENABLE_REVERSE_ITERATION=on
to one of the worker and then get coverage for check-flang
.
Similarly, there are multiple mlir-*
builders testing check-mlir
. We can change one to use -DLLVM_ENABLE_REVERSE_ITERATION=on
.
The reverse-iteration
bot can possibly do additional check-lld
. check-lld
tests are very fast, so hopefully there will be no capacity problem.
I oversee the bots but flang isn’t my usual area, so we (Linaro) will talk it over internally. I/we will get back to you shortly.
Linaro will cover flang with LLVM_ENABLE_REVERSE_ITERATION
. We just need some time to figure out what form that will take, new bot, or adding to an existing one.
Consider putting reverse_it in the name or tagging it if possible. Saves people digging into the cmake after a long time being confused why they can’t reproduce the issue.
The flang bot is online now Buildbot (pretty slow right now, it’ll catch up as the ccache fills up).
1 Like
Thank you!
If -DCMAKE_BUILD_TYPE=Debug
builds are too slow, perhaps try -O1
?
I could but the point is to keep checking the debug configuration as well. Times are up across the board for flang which is to be expected after a restart, debug reverse iteration isn’t an outlier anyway.
LLVM_ENABLE_REVERSE_ITERATION only applies to pointer-like types.
% cat llvm/include/llvm/Support/ReverseIteration.h
...
template<class T = void *>
bool shouldReverseIterate() {
#if LLVM_ENABLE_REVERSE_ITERATION
return detail::IsPointerLike<T>::value;
#else
return false;
#endif
}
Code might rely on the iteration order of DenseMap<StringRef, X>
and making
DenseMap
/hash_value(StringRef)
replacement difficult.
Code might rely on hash_value(StringRef)
and use it for on-disk serialization.
I’ve fixed quite a few issues in f8f4235612b9 c025bd1fdbbd 89e8e63f47ff
86eb6bf6715c eb8d03656549 0ea6b8e476c2 58d7a6e0e636 8ea31db27211
255986e27fcf.
This effort allows us to try replacing the algorithm in Hashing.h.
Using a non-deterministic seed for Hashing.h should help: [Hashing] Use a non-deterministic seed by MaskRay · Pull Request #96282 · llvm/llvm-project · GitHub
See also Determinism in hash tables · Issue #339 · abseil/abseil-cpp · GitHub
1 Like