On 2014-Apr-15, at 23:28, Chandler Carruth <[email protected]> wrote:

> I don't really understand the use of RAV here,

I think Bob's idea in r206039 is to avoid repeating the traversal logic.
I like the direction myself.

> or the logic of having a secondary switch, but at this point, there are too 
> many patches flying and I feel like there is some more extensive discussion 
> that took place somewhere other than this thread. =/

Not really.  Just coordination around how to stage changes we knew would
conflict.  In the end we reversed them.

> No fun when you get bounced back and forth in code review.

I can take it :).

> I'm happy to go with the implementation strategy as you have it. I may even 
> write up a patch to show how I'm imagining you might simplify this. Anyways...
> 
> Some more microscopic nits. Feel free to commit whenever.

r206397

> I like where this design has ended up, and thanks for seeing it through. =]

Thanks for your help designing the hash -- much better than where this
started off!

> +/// \brief Stable hasher for PGO region counters.
> +///
> +/// PGOHash produces a stable hash of a given function's control flow.
> +///
> +/// Changing the output of this hash will invalidate all previously generated
> +/// profiles -- i.e., don't do it.
> +///
> +/// \note  When this hash does eventually change (years?), we still need to
> +/// support old hashes.  We'll need to pull in the version number from the
> +/// profile data format and use the matching hash function.
> +class PGOHash {
> +  constexpr static int NumBitsPerType = 6;
> +  constexpr static unsigned NumTypesPerWord =
> +      sizeof(uint64_t) * 8 / NumBitsPerType;
> +  constexpr static unsigned TooBig = 1u << NumBitsPerType;
> 
> I would sink these to live down with the static_assert, and sink all of it 
> into the existing private section with member variables.

Yup, better to merge the private sections here.

Also, turns out MSVC doesn't like constexpr; I switched to static const.

> +
> +public:
> +  /// \brief Hash values for AST nodes.
> +  ///
> +  /// Distinct values for AST nodes that have region counters attached.
> +  ///
> +  /// These values must be stable.  All new members must be added at the end,
> +  /// and no members should be removed.  Changing the enumeration value for 
> an
> +  /// AST node will affect the hash of every function that contains that 
> node.
> +  enum HashType : unsigned char {
> +    None = 0,
> +    LabelStmt = 1,
> +    WhileStmt,
> +    DoStmt,
> +    ForStmt,
> +    CXXForRangeStmt,
> +    ObjCForCollectionStmt,
> +    SwitchStmt,
> +    CaseStmt,
> +    DefaultStmt,
> +    IfStmt,
> +    CXXTryStmt,
> +    CXXCatchStmt,
> +    ConditionalOperator,
> +    BinaryOperatorLAnd,
> +    BinaryOperatorLOr,
> +    BinaryConditionalOperator,
> +
> +    // Keep this last.  It's for the static assert that follows.
> +    LastHashType
> +  };
> +  static_assert(LastHashType <= TooBig, "Too many types in HashType");
> +
> +private:
> +  uint64_t Working;
> +  unsigned Count;
> +  llvm::MD5 MD5;
> +
> +public:
> +  // TODO: When this format changes, take in a version number here, and use 
> the
> +  // old hash calculation for file formats that used the old hash.
> +  PGOHash() : Working(0), Count(0) {}
> +  void combine(HashType Type);
> +  uint64_t finalize();
> 
> I would just put these up with the public enum. Excepting private types or 
> enums which are necessary to define prior to the public interface (because it 
> is defined in terms of them), I generally prefer the public interface at the 
> top followed by the private interface. Mild preference though.

My preference is to put member variables before functions, but I
shuffled things a little to make it cleaner.

> +};

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to