njames93 added inline comments.

================
Comment at: 
clang-tools-extra/clang-tidy/cppcoreguidelines/SymmetricBinaryOperatorCheck.cpp:56
+bool isComparisonOperator(OverloadedOperatorKind Kind) {
+  return llvm::is_contained(
+      std::initializer_list<OverloadedOperatorKind>{
----------------
5chmidti wrote:
> njames93 wrote:
> > Could these not be represented as a bitset?
> Yes. I changed this to use a bitset. While changing it I thought about the 
> performance and came to these two solutions:
> A) is straight forward but suffers from bad-ish code gen when doing -O0 (58 
> instructions), on -O1 and up it's just 4 instructions.
> ```
> bool isComparisonOperator(OverloadedOperatorKind Kind) {
>   std::bitset<NUM_OVERLOADED_OPERATORS> BitSetCompOps{};
>   BitSetCompOps.set(OO_Less);
>   BitSetCompOps.set(OO_Greater);
>   BitSetCompOps.set(OO_EqualEqual);
>   BitSetCompOps.set(OO_ExclaimEqual);
>   BitSetCompOps.set(OO_LessEqual);
>   BitSetCompOps.set(OO_GreaterEqual);
>   BitSetCompOps.set(OO_Spaceship);
>   BitSetCompOps.set(OO_AmpAmp);
>   BitSetCompOps.set(OO_PipePipe);
>   return BitSetCompOps[Kind];
> }
> ```
> 
> B) the same, but this emits much less code during -O0 (14 instructions) and 
> for -O1 and up it's the same as A)
> ```
> template <OverloadedOperatorKind... ComparisonKinds>
> constexpr size_t isComparisonOperatorGenerateBitset() {
>   return ((static_cast<size_t>(1U) << ComparisonKinds) | ...);
> }
> 
> bool isComparisonOperator(OverloadedOperatorKind Kind) {
>   constexpr static auto BitsetCompOps = isComparisonOperatorGenerateBitset<
>       OO_Less, OO_Greater, OO_EqualEqual, OO_ExclaimEqual, OO_LessEqual,
>       OO_GreaterEqual, OO_Spaceship, OO_AmpAmp, OO_PipePipe>();
>   return BitsetCompOps & (static_cast<size_t>(1U) << Kind);
> }
> ```
> See also https://godbolt.org/z/E9aeW67xb for both examples.
> I think B) would be better, but I thought I'd ask before going with a 
> parameter pack instead of the std::bitset.
If the optimiser is able to see through the original set up then there's no 
issue and the initial code should be fine.


================
Comment at: 
clang-tools-extra/clang-tidy/cppcoreguidelines/SymmetricBinaryOperatorCheck.cpp:84
+
+static Expected<DynTypedNode> getNode(const BoundNodes &Nodes, StringRef ID) {
+  auto &NodesMap = Nodes.getMap();
----------------
5chmidti wrote:
> njames93 wrote:
> > Should there ever be a case where this returns an error. If not can this 
> > assert instead and just return a DynTypedNode?
> I got this bit from the Transformer lib implementation, but you're right, 
> there are no paths in this check that call getNode with an unbound ID.
In which case make the below an assert and return by DynTypedNode.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D128861/new/

https://reviews.llvm.org/D128861

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to