[PATCH] D126040: [InstCombine] Fold a mul with bool value into and

Allen zhong via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri May 20 01:21:22 PDT 2022


Allen added inline comments.


================
Comment at: llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp:312
+        match(Op1, m_And(m_Value(Y), m_One())))
+      return BinaryOperator::CreateAnd(Op0, Op1);
+  }
----------------
craig.topper wrote:
> xbolva00 wrote:
> > grandinj wrote:
> > > Surely the more general case is something like:
> > > 
> > >     if (ComputeMaxSignificantBits(Op0) ==1 ||
> > >         ComputeMaxSignificantBits(Op1)==1)
> > > 
> > > ?
> > > 
> > Yeah, please more general case.
> ComputeMaxSignificantBits(Op0) ==1 means the input is 0 or -1.
> 
> You would need computeKnownBits or MaskedValueIsZero.
Thanks very much , I'll try to use the API ComputeMaxSignificantBits.

and there is some failure cases, for example, it 'll turn the -42 into 42.
```
; X * C (when X is a sext boolean) --> X ? -C : 0

define i32 @mul_sext_bool(i1 %x) {
; CHECK-LABEL: @mul_sext_bool(   
; CHECK-NEXT:    [[M:%.*]] = select i1 [[X:%.*]], i32 -42, i32 0
; CHECK-NEXT:    ret i32 [[M]]
;            
  %s = sext i1 %x to i32
  %m = mul i32 %s, 42
  ret i32 %m
}
```


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

https://reviews.llvm.org/D126040



More information about the llvm-commits mailing list