[PATCH] D100304: [AArch64][NEON] Match (or (and -a b) (and (a+1) b)) => bit select

Joe Ellis via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 13 09:45:52 PDT 2021


joechrisellis added inline comments.


================
Comment at: llvm/lib/Target/AArch64/AArch64ISelLowering.cpp:12581-12597
+      SDValue O0 = N0->getOperand(i);
+      SDValue O1 = N1->getOperand(j);
+      SDValue Sub, Add, SubSibling, AddSibling;
+
+      // Find a SUB and an ADD operand, one from each AND.
+      if (O0.getOpcode() == ISD::SUB && O1.getOpcode() == ISD::ADD) {
+        Sub = O0;
----------------
bsmith wrote:
> joechrisellis wrote:
> > Small suggestion -- it might be possible to get rid of some duplicate code here by doing something like:
> > 
> > ```
> > if (O0.getOpcode() == ISD::SUB)
> >     std::swap(O0, O1);
> > 
> > if (O1.getOpcode() != ISD::ADD)
> >     continue;
> > 
> > // if we get here, O0 is guaranteed to be the sub, and O1 the add
> > ...
> > ```
> > 
> > If this works, I _think_ it might make things clearer. But I don't know for sure. If it starts to look uglier then I have no problem with it as-is. :) 
> To be honest I think something like this is just going to end up being more confusing, for the sake of saving a couple of duplicated lines, I really don't think it's worth it. Also note that your example doesn't work since the second check isn't correct in the case the operands have been swapped.
You're right! It should have been something like:

```
if (O0.getOpcode() != ISD::SUB)
    std::swap(O0, O1);

if (O0.getOpcode() != ISD::SUB || O1.getOpcode() != ISD::ADD)
    continue;

// if we get here, O0 is guaranteed to be the sub, and O1 the add
...
```

... either way, you are right; `N0` and `N1` make this a bit more awkward than I had anticipated. ACK. 🙂 


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D100304



More information about the llvm-commits mailing list