[PATCH] D144777: [InstCombine] Fold signbit test of a pow2 or zero

Jun Zhang via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 24 23:31:11 PST 2023


junaire added inline comments.


================
Comment at: llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp:1343
+  // icmp sgt (and (sub 0, X), X), -1 --> icmp ne (X, CI)
+  if (match(Op0, m_OneUse(m_And(m_Sub(m_Zero(), m_Value(X)), m_Deferred(X))))) {
+    Constant *CI = ConstantInt::get(
----------------
goldstein.w.n wrote:
> goldstein.w.n wrote:
> > goldstein.w.n wrote:
> > > There are other power of 2 patterns. Maybe use `isKnownPowerOf2`?
> > disregard, misunderstood the patch.
> `m_Sub(m_Zero(), m_Value(X))` -> `m_Neg(m_Value(X))`?
> Also do you need `m_OneUse`? This shouldn't ever create more instructions.
> Also do you need m_OneUse? This shouldn't ever create more instructions.

I thought it was unnecessary at first, but then it cause a regression in `smax_xor_pow2_neg`,
so I added it.

```
@@ -137,7 +137,10 @@ define i8 @smax_xor_pow2_neg(i8 %x, i8 %y) {                                                                                      ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[Y:%.*]], -128                                                                                             ; CHECK-NEXT:    br i1 [[CMP]], label [[NEG:%.*]], label [[POS:%.*]]                                                                                  ; CHECK:       neg:                                                                                                                                  -; CHECK-NEXT:    [[R:%.*]] = and i8 [[X:%.*]], 127                                                                                                   +; CHECK-NEXT:    [[NY:%.*]] = sub i8 0, [[Y]]                                                                                                        +; CHECK-NEXT:    [[YP2:%.*]] = and i8 [[NY]], [[Y]]                                                                                                  +; CHECK-NEXT:    [[X_XOR:%.*]] = xor i8 [[YP2]], [[X:%.*]]                                                                                           +; CHECK-NEXT:    [[R:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[X_XOR]])                                                                            ; CHECK-NEXT:    ret i8 [[R]]                                                                                                                         ; CHECK:       pos:                                                                                                                                   ; CHECK-NEXT:    call void @barrier()                                                                                                                
```


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D144777



More information about the llvm-commits mailing list