Mogball added inline comments.

================
Comment at: mlir/lib/Transforms/Utils/CommutativityUtils.cpp:76
+      // `CONSTANT_OP` and `opName` remains "".
+      type = CONSTANT_OP;
+    }
----------------
srishti-pm wrote:
> Mogball wrote:
> > Constant ops could be sorted by name as well.
> The only reason we separated constant ops from the non-constant ops was 
> because the former are canonicalized to the right (as a stable sort) by 
> existing canonicalizations. And, we didn't want our algorithm to conflict 
> with these existing canonicalizations. That is the reason I am not sorting 
> them by name and just keeping them to the right (as a stable sort).
I know. You can sort them separately from regular ops and also by name and the 
overall behaviour would be the same.


================
Comment at: mlir/lib/Transforms/Utils/CommutativityUtils.cpp:269
+    ArrayRef<std::unique_ptr<OperandBFS>> bfsOfOperands,
+    bool &hasOneOperandWithKey) {
+  bool keyFound = false;
----------------
srishti-pm wrote:
> Mogball wrote:
> > This flag is not necessary because you can just check 
> > `bfsOfOperandsWithKey.size() == 1`
> `.size()` is an O(N) operation and that is why I usually try to avoid it. Do 
> you still agree we should use it here? I understand that N is an expectedly 
> small value.
Size is constant time 


================
Comment at: mlir/lib/Transforms/Utils/CommutativityUtils.cpp:278-279
+    if (compareKeys(key, currentKey) == 0) {
+      bfsOfOperandsWithKey.push_back(
+          std::make_unique<OperandBFS>(*bfsOfOperand));
+      if (keyFound)
----------------
srishti-pm wrote:
> Mogball wrote:
> > You don't need to make a copy. In fact, I think you should just track the 
> > indices.
> I agree. But, we had discussed to store operands instead of indices and 
> that's why I did this. I will change this to use indices again (keeping other 
> things unchanged).
I mean you can have list (not a set) of indices to shift


================
Comment at: mlir/lib/Transforms/Utils/CommutativityUtils.cpp:329-353
+  assert(frontPosition >= 0 && frontPosition < bfsOfOperands.size() &&
+         "`frontPosition` should be valid");
+  unsigned positionOfOperandToShift;
+  bool foundOperandToShift = false;
+  for (auto &indexedBfsOfOperand : llvm::enumerate(bfsOfOperands)) {
+    std::unique_ptr<OperandBFS> &bfsOfOperand = indexedBfsOfOperand.value();
+    if (bfsOfOperand->isSorted)
----------------
srishti-pm wrote:
> Mogball wrote:
> > There is no way you need this much code. A `std::swap` between the current 
> > operand and the first unsorted position should be enough.
> If I do a swap, the sorting will no longer be stable and I believe that there 
> was a discussion that concluded with the fact that "we want stable sorting".
That's true, but shifting like this is very slow as well. At this point, you 
might want to give `std::stable_sort` with a custom comparator that does extra 
BFS iterations on demand a try.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D124750

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

Reply via email to