[llvm] 952c274 - [RDA] Use TinyPtrVector to store reaching defs (NFCI)

Mikael Holmén via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 8 22:53:48 PDT 2020


Hi,

In our downstream bots running with sanitizers we see lots of
complaints like

../include/llvm/CodeGen/ReachingDefAnalysis.h:47:43: runtime error:
left shift of negative value -1

I haven't verified that they really start occuring with this patch, but
the left shift it complains on was at least added here.

I think the same can be seen here:
http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast

/Mikael


On Wed, 2020-04-08 at 08:52 -0700, Nikita Popov via llvm-commits wrote:
> Author: Nikita Popov
> Date: 2020-04-08T17:46:24+02:00
> New Revision: 952c2741599ed492cedd37da895d7e81bc175ab9
> 
> URL: 
> https://github.com/llvm/llvm-project/commit/952c2741599ed492cedd37da895d7e81bc175ab9
> DIFF: 
> https://github.com/llvm/llvm-project/commit/952c2741599ed492cedd37da895d7e81bc175ab9.diff
> 
> LOG: [RDA] Use TinyPtrVector to store reaching defs (NFCI)
> 
> RDA currently uses SmallVector<int, 1> to store reaching definitions.
> A SmallVector<int, 1> is 24 bytes large, and X86 currently has
> 164 register units, which means we need 3936 bytes per block.
> If you have a large function with 1000 blocks, that's already 4MB.
> 
> A large fraction of these reg units will not have any reaching defs
> (say, those corresponding to zmm registers), and many will have just
> one. A TinyPtrVector serves this use-case much better, as it only
> needs 8 bytes per register if it has 0 or 1 reaching defs.
> 
> As the name implies, TinyPtrVector is designed to work with pointers,
> so we need to add some boilerplate to treat our reaching def integers
> as pointers, using an appropriate encoding. We need to keep the low
> bit free for tagging, and make sure at least one bit is set to
> distinguish the null pointer.
> 
> Differential Revision: https://reviews.llvm.org/D77513
> 
> Added: 
>     
> 
> Modified: 
>     llvm/include/llvm/CodeGen/ReachingDefAnalysis.h
> 
> Removed: 
>     
> 
> 
> #####################################################################
> ###########
> diff  --git a/llvm/include/llvm/CodeGen/ReachingDefAnalysis.h
> b/llvm/include/llvm/CodeGen/ReachingDefAnalysis.h
> index 608f0dff4ccb..8def1a6d39fc 100644
> --- a/llvm/include/llvm/CodeGen/ReachingDefAnalysis.h
> +++ b/llvm/include/llvm/CodeGen/ReachingDefAnalysis.h
> @@ -23,6 +23,7 @@
>  
>  #include "llvm/ADT/DenseMap.h"
>  #include "llvm/ADT/SmallVector.h"
> +#include "llvm/ADT/TinyPtrVector.h"
>  #include "llvm/CodeGen/LoopTraversal.h"
>  #include "llvm/CodeGen/MachineFunctionPass.h"
>  #include "llvm/InitializePasses.h"
> @@ -32,6 +33,37 @@ namespace llvm {
>  class MachineBasicBlock;
>  class MachineInstr;
>  
> +/// Thin wrapper around "int" used to store reaching definitions,
> +/// using an encoding that makes it compatible with TinyPtrVector.
> +/// The 0th LSB is forced zero (and will be used for pointer union
> tagging),
> +/// The 1st LSB is forced one (to make sure the value is non-zero).
> +class ReachingDef {
> +  uintptr_t Encoded;
> +  friend struct PointerLikeTypeTraits<ReachingDef>;
> +  explicit ReachingDef(uintptr_t Encoded) : Encoded(Encoded) {}
> +
> +public:
> +  ReachingDef(int Instr) : Encoded((Instr << 2) | 2) {}
> +  operator int() const { return ((int) Encoded) >> 2; }
> +};
> +
> +template<>
> +struct PointerLikeTypeTraits<ReachingDef> {
> +  static constexpr int NumLowBitsAvailable = 1;
> +
> +  static inline void *getAsVoidPointer(const ReachingDef &RD) {
> +    return reinterpret_cast<void *>(RD.Encoded);
> +  }
> +
> +  static inline ReachingDef getFromVoidPointer(void *P) {
> +    return ReachingDef(reinterpret_cast<uintptr_t>(P));
> +  }
> +
> +  static inline ReachingDef getFromVoidPointer(const void *P) {
> +    return ReachingDef(reinterpret_cast<uintptr_t>(P));
> +  }
> +};
> +
>  /// This class provides the reaching def analysis.
>  class ReachingDefAnalysis : public MachineFunctionPass {
>  private:
> @@ -61,7 +93,7 @@ class ReachingDefAnalysis : public
> MachineFunctionPass {
>    DenseMap<MachineInstr *, int> InstIds;
>  
>    /// All reaching defs of a given RegUnit for a given MBB.
> -  using MBBRegUnitDefs = SmallVector<int, 1>;
> +  using MBBRegUnitDefs = TinyPtrVector<ReachingDef>;
>    /// All reaching defs of all reg units for a given MBB
>    using MBBDefsInfo = std::vector<MBBRegUnitDefs>;
>    /// All reaching defs of all reg units for a all MBBs
> 
> 
>         
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list