[llvm] [InstCombine] Try the flipped strictness of predicate in `foldICmpShlConstant` (PR #92773)

via llvm-commits llvm-commits at lists.llvm.org
Mon May 20 09:47:12 PDT 2024


================
@@ -2414,14 +2414,37 @@ Instruction *InstCombinerImpl::foldICmpShlConstant(ICmpInst &Cmp,
   // free on the target. It has the additional benefit of comparing to a
   // smaller constant that may be more target-friendly.
   unsigned Amt = ShiftAmt->getLimitedValue(TypeBits - 1);
-  if (Shl->hasOneUse() && Amt != 0 && C.countr_zero() >= Amt &&
-      DL.isLegalInteger(TypeBits - Amt)) {
-    Type *TruncTy = IntegerType::get(Cmp.getContext(), TypeBits - Amt);
-    if (auto *ShVTy = dyn_cast<VectorType>(ShType))
-      TruncTy = VectorType::get(TruncTy, ShVTy->getElementCount());
-    Constant *NewC =
-        ConstantInt::get(TruncTy, C.ashr(*ShiftAmt).trunc(TypeBits - Amt));
-    return new ICmpInst(Pred, Builder.CreateTrunc(X, TruncTy), NewC);
+  if (Shl->hasOneUse() && Amt != 0 && DL.isLegalInteger(TypeBits - Amt)) {
+    auto FoldICmpShlToICmpTrunc = [&](ICmpInst::Predicate Pred,
+                                      const APInt &C) -> Instruction * {
+      if (C.countr_zero() < Amt)
+        return nullptr;
+      Type *TruncTy = ShType->getWithNewBitWidth(TypeBits - Amt);
+      Constant *NewC =
+          ConstantInt::get(TruncTy, C.ashr(*ShiftAmt).trunc(TypeBits - Amt));
+      return new ICmpInst(
+          Pred, Builder.CreateTrunc(X, TruncTy, "", Shl->hasNoSignedWrap()),
----------------
goldsteinn wrote:

You have `nuw` propagation in your proofs no?
```

define i1 @src_ult_nuw(i32 %x, i32 %c) {
  %cttz = call i32 @llvm.cttz.i32(i32 %c, i1 true)
  %cond = icmp uge i32 %cttz, 16
  call void @llvm.assume(i1 %cond)

  %shl = shl nuw i32 %x, 16
  %icmp = icmp ult i32 %shl, %c
  ret i1 %icmp
}

define i1 @tgt_ult_nuw(i32 %x, i32 %c) {
  %trunc = trunc i32 %x to i16
  %ashr_c = ashr i32 %c, 16
  %trunc_c = trunc nuw i32 %ashr_c to i16
  %icmp = icmp ult i16 %trunc, %trunc_c
  ret i1 %icmp
```

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


More information about the llvm-commits mailing list