This patch removes waymarking and replaces it with storing a pointer to the User in the Use.
when compiling the CTMark tests of the test suite, this give an average of +1.8% max memory use and -1.1% compile time.
Removing Waymarking also simplifies the code of Use and User.
Waymarking is very complicated, and I’d be generally +1 on removing it if it is not paying for itself. It is also nice to see compiler speedups!
I’m curious about kimwitu++ though - when waymarking initially landed, it was a significant memory size win for that. Do you have any idea why you’re not seeing the same difference? Is it possible that different things were being measured back then?
I’ve also done some testing myself and noticed only about 1-2% increase of memory, in exchange for about 1-3% increase of speed.
I can’t say that a speedup of 3% (at most, and usually 1%), worth working for, this is a simple change, that give a lot more than this; especially simpler code path (also easier debugging).
As part of my measurements, while compiling “deal.II”, the maximum number of simultaneous Use instances was 2,728,963 (and in most cases, about half of it).
In a 64-bit process (Clang for that matter), we will have roughly 21 MB of memory spent on the extra pointer (of 8 bytes size).
On a 16-core machine, for which, in many cases, a build will trigger that many simultaneous Clang processes, we will reach, in the worst case, 336 MB more memory spent on compilation.
Is it worth it? I think it is. But I am not sure I see the whole picture - are there low-memory systems that need to run LLVM on?
I am not sure what needs to be done to approve such a fundamental change; especially when we can’t prove the Waymarking was needed at all.
I've also done some testing myself and noticed only about 1-2% increase of
memory, in exchange for about 1-3% increase of speed.
I can't say that a speedup of 3% (at most, and usually 1%), worth working
for, this is a simple change, that give a lot more than this; especially
simpler code path (also easier debugging).
As part of my measurements, while compiling "deal.II", the maximum number
of simultaneous `Use` instances was 2,728,963 (and in most cases, about
half of it).
In a 64-bit process (Clang for that matter), we will have roughly 21 MB of
memory spent on the extra pointer (of 8 bytes size).
On a 16-core machine, for which, in many cases, a build will trigger that
many simultaneous Clang processes, we will reach, in the worst case, 336 MB
more memory spent on compilation.
Is it worth it? I think it is. But I am not sure I see the whole picture -
are there low-memory systems that need to run LLVM on?
I am not sure what needs to be done to approve such a fundamental change;
especially when we can't prove the Waymarking was needed at all.
I guess if no-one brings forth arguments (= results) for keeping it and
people continue to support replacing it, we will replace it. There should
be a grace period in which people have the chance to do their benchmarking
(basically what is happening), but I don't recall a problem being reported yet.
I agree. I’m not hearing strong arguments to retain it, so let’s remove it. Worst case, we can always reinstate it if there is a good reason discovered down the line. Thank you!
Maybe we can utilize the implementation in mlir/IR/UseDefLists.h in here (clearly it is superior to llvm::Use) ?
By that we will have the same code base (instead of duplicate implementations of Use-Lists).