[llvm] [X86] Improve transform for add-like nodes to `add` (PR #83691)

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Sun Mar 3 00:02:26 PST 2024


topperc wrote:

> > This seems like maybe the better patch
> > ```
> > diff --git a/llvm/lib/Target/X86/X86InstrFragments.td b/llvm/lib/Target/X86/X86InstrFragments.td
> > index adf527d72f5b..90ff0625e812 100644
> > --- a/llvm/lib/Target/X86/X86InstrFragments.td
> > +++ b/llvm/lib/Target/X86/X86InstrFragments.td
> > @@ -676,12 +676,7 @@ def def32 : PatLeaf<(i32 GR32:$src), [{
> >  
> >  // Treat an 'or' node is as an 'add' if the or'ed bits are known to be zero.
> >  def or_is_add : PatFrag<(ops node:$lhs, node:$rhs), (or node:$lhs, node:$rhs),[{
> > -  if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N->getOperand(1)))
> > -    return CurDAG->MaskedValueIsZero(N->getOperand(0), CN->getAPIntValue());
> > -
> > -  KnownBits Known0 = CurDAG->computeKnownBits(N->getOperand(0), 0);
> > -  KnownBits Known1 = CurDAG->computeKnownBits(N->getOperand(1), 0);
> > -  return (~Known0.Zero & ~Known1.Zero) == 0;
> > +  return CurDAG->isADDLike(SDValue(N, 0));
> >  }]>;
> >  
> >  def shiftMask8 : PatFrag<(ops node:$lhs), (and node:$lhs, imm), [{
> > ```
> 
> I tried that, but it didn't work. What seemed to be the case is when we handle `or_is_add` we no longer have `ISD::OR`, but instead `X86ISD::OR{width}r{i/r}`

I thought X86ISD::OR should only be used when the flags are needed

https://github.com/llvm/llvm-project/pull/83691


More information about the llvm-commits mailing list