<div dir="ltr"><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Apr 9, 2020 at 7:53 AM Mikael Holmén <<a href="mailto:mikael.holmen@ericsson.com">mikael.holmen@ericsson.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi,<br>
<br>
In our downstream bots running with sanitizers we see lots of<br>
complaints like<br>
<br>
../include/llvm/CodeGen/ReachingDefAnalysis.h:47:43: runtime error:<br>
left shift of negative value -1<br>
<br>
I haven't verified that they really start occuring with this patch, but<br>
the left shift it complains on was at least added here.<br>
<br>
I think the same can be seen here:<br>
<a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast" rel="noreferrer" target="_blank">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast</a><br>
<br>
/Mikael<br></blockquote><div><br></div><div>Thanks for the pointer! This should be fixed with <a href="https://github.com/llvm/llvm-project/commit/8f66f25f52f9b4089d216a33283acdb87ea3c250">https://github.com/llvm/llvm-project/commit/8f66f25f52f9b4089d216a33283acdb87ea3c250</a>.</div><div><br></div><div>Regards,<br></div><div>Nikita<br> </div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
On Wed, 2020-04-08 at 08:52 -0700, Nikita Popov via llvm-commits wrote:<br>
> Author: Nikita Popov<br>
> Date: 2020-04-08T17:46:24+02:00<br>
> New Revision: 952c2741599ed492cedd37da895d7e81bc175ab9<br>
> <br>
> URL: <br>
> <a href="https://github.com/llvm/llvm-project/commit/952c2741599ed492cedd37da895d7e81bc175ab9" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/952c2741599ed492cedd37da895d7e81bc175ab9</a><br>
> DIFF: <br>
> <a href="https://github.com/llvm/llvm-project/commit/952c2741599ed492cedd37da895d7e81bc175ab9.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/952c2741599ed492cedd37da895d7e81bc175ab9.diff</a><br>
> <br>
> LOG: [RDA] Use TinyPtrVector to store reaching defs (NFCI)<br>
> <br>
> RDA currently uses SmallVector<int, 1> to store reaching definitions.<br>
> A SmallVector<int, 1> is 24 bytes large, and X86 currently has<br>
> 164 register units, which means we need 3936 bytes per block.<br>
> If you have a large function with 1000 blocks, that's already 4MB.<br>
> <br>
> A large fraction of these reg units will not have any reaching defs<br>
> (say, those corresponding to zmm registers), and many will have just<br>
> one. A TinyPtrVector serves this use-case much better, as it only<br>
> needs 8 bytes per register if it has 0 or 1 reaching defs.<br>
> <br>
> As the name implies, TinyPtrVector is designed to work with pointers,<br>
> so we need to add some boilerplate to treat our reaching def integers<br>
> as pointers, using an appropriate encoding. We need to keep the low<br>
> bit free for tagging, and make sure at least one bit is set to<br>
> distinguish the null pointer.<br>
> <br>
> Differential Revision: <a href="https://reviews.llvm.org/D77513" rel="noreferrer" target="_blank">https://reviews.llvm.org/D77513</a><br>
> <br>
> Added: <br>
>     <br>
> <br>
> Modified: <br>
>     llvm/include/llvm/CodeGen/ReachingDefAnalysis.h<br>
> <br>
> Removed: <br>
>     <br>
> <br>
> <br>
> #####################################################################<br>
> ###########<br>
> diff  --git a/llvm/include/llvm/CodeGen/ReachingDefAnalysis.h<br>
> b/llvm/include/llvm/CodeGen/ReachingDefAnalysis.h<br>
> index 608f0dff4ccb..8def1a6d39fc 100644<br>
> --- a/llvm/include/llvm/CodeGen/ReachingDefAnalysis.h<br>
> +++ b/llvm/include/llvm/CodeGen/ReachingDefAnalysis.h<br>
> @@ -23,6 +23,7 @@<br>
>  <br>
>  #include "llvm/ADT/DenseMap.h"<br>
>  #include "llvm/ADT/SmallVector.h"<br>
> +#include "llvm/ADT/TinyPtrVector.h"<br>
>  #include "llvm/CodeGen/LoopTraversal.h"<br>
>  #include "llvm/CodeGen/MachineFunctionPass.h"<br>
>  #include "llvm/InitializePasses.h"<br>
> @@ -32,6 +33,37 @@ namespace llvm {<br>
>  class MachineBasicBlock;<br>
>  class MachineInstr;<br>
>  <br>
> +/// Thin wrapper around "int" used to store reaching definitions,<br>
> +/// using an encoding that makes it compatible with TinyPtrVector.<br>
> +/// The 0th LSB is forced zero (and will be used for pointer union<br>
> tagging),<br>
> +/// The 1st LSB is forced one (to make sure the value is non-zero).<br>
> +class ReachingDef {<br>
> +  uintptr_t Encoded;<br>
> +  friend struct PointerLikeTypeTraits<ReachingDef>;<br>
> +  explicit ReachingDef(uintptr_t Encoded) : Encoded(Encoded) {}<br>
> +<br>
> +public:<br>
> +  ReachingDef(int Instr) : Encoded((Instr << 2) | 2) {}<br>
> +  operator int() const { return ((int) Encoded) >> 2; }<br>
> +};<br>
> +<br>
> +template<><br>
> +struct PointerLikeTypeTraits<ReachingDef> {<br>
> +  static constexpr int NumLowBitsAvailable = 1;<br>
> +<br>
> +  static inline void *getAsVoidPointer(const ReachingDef &RD) {<br>
> +    return reinterpret_cast<void *>(RD.Encoded);<br>
> +  }<br>
> +<br>
> +  static inline ReachingDef getFromVoidPointer(void *P) {<br>
> +    return ReachingDef(reinterpret_cast<uintptr_t>(P));<br>
> +  }<br>
> +<br>
> +  static inline ReachingDef getFromVoidPointer(const void *P) {<br>
> +    return ReachingDef(reinterpret_cast<uintptr_t>(P));<br>
> +  }<br>
> +};<br>
> +<br>
>  /// This class provides the reaching def analysis.<br>
>  class ReachingDefAnalysis : public MachineFunctionPass {<br>
>  private:<br>
> @@ -61,7 +93,7 @@ class ReachingDefAnalysis : public<br>
> MachineFunctionPass {<br>
>    DenseMap<MachineInstr *, int> InstIds;<br>
>  <br>
>    /// All reaching defs of a given RegUnit for a given MBB.<br>
> -  using MBBRegUnitDefs = SmallVector<int, 1>;<br>
> +  using MBBRegUnitDefs = TinyPtrVector<ReachingDef>;<br>
>    /// All reaching defs of all reg units for a given MBB<br>
>    using MBBDefsInfo = std::vector<MBBRegUnitDefs>;<br>
>    /// All reaching defs of all reg units for a all MBBs<br>
> <br>
> <br>
>         <br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
> <a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div>