[PATCH] D156845: [ConstantRange] Calculate precise range for shl by -1

Allen zhong via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 2 01:57:49 PDT 2023


Allen updated this revision to Diff 546361.
Allen edited the summary of this revision.
Allen added a comment.

1、update the proofs 
2、Precommit test on D156865 <https://reviews.llvm.org/D156865>


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

https://reviews.llvm.org/D156845

Files:
  llvm/lib/IR/ConstantRange.cpp
  llvm/test/Transforms/FunctionSpecialization/and-add-shl.ll


Index: llvm/test/Transforms/FunctionSpecialization/and-add-shl.ll
===================================================================
--- llvm/test/Transforms/FunctionSpecialization/and-add-shl.ll
+++ llvm/test/Transforms/FunctionSpecialization/and-add-shl.ll
@@ -30,8 +30,7 @@
 ; CHECK-NEXT:    call void @llvm.assume(i1 [[OP1_P2]])
 ; CHECK-NEXT:    [[SHIFT:%.*]] = shl nsw i8 -1, [[X]]
 ; CHECK-NEXT:    [[NOT:%.*]] = xor i8 [[SHIFT]], -1
-; CHECK-NEXT:    [[R:%.*]] = and i8 [[NOT]], 32
-; CHECK-NEXT:    ret i8 [[R]]
+; CHECK-NEXT:    ret i8 0
 ;
   %op1_p2 = icmp ule i8 %x, 5
   call void @llvm.assume(i1 %op1_p2)
@@ -48,8 +47,7 @@
 ; CHECK-NEXT:    call void @llvm.assume(i1 [[OP1_P2]])
 ; CHECK-NEXT:    [[SHIFT:%.*]] = shl nsw i8 -1, [[X]]
 ; CHECK-NEXT:    [[NOT:%.*]] = xor i8 [[SHIFT]], -1
-; CHECK-NEXT:    [[R:%.*]] = and i8 [[NOT]], 48
-; CHECK-NEXT:    ret i8 [[R]]
+; CHECK-NEXT:    ret i8 0
 ;
   %op1_p2 = icmp ule i8 %x, 4
   call void @llvm.assume(i1 %op1_p2)
Index: llvm/lib/IR/ConstantRange.cpp
===================================================================
--- llvm/lib/IR/ConstantRange.cpp
+++ llvm/lib/IR/ConstantRange.cpp
@@ -1478,6 +1478,13 @@
 
   APInt OtherMax = Other.getUnsignedMax();
 
+  bool Neg = false;
+  if (getSingleElement() && isAllNegative()) {
+    Neg = true;
+    Min = Min.abs();
+    Max = Max.abs();
+  }
+
   // There's overflow!
   if (OtherMax.ugt(Max.countl_zero()))
     return getFull();
@@ -1487,7 +1494,12 @@
   Min <<= Other.getUnsignedMin();
   Max <<= OtherMax;
 
-  return ConstantRange::getNonEmpty(std::move(Min), std::move(Max) + 1);
+  if (Neg) {
+    Min = -Min;
+    Max = -Max;
+    return ConstantRange::getNonEmpty(std::move(Max), std::move(Min) + 1);
+  } else
+    return ConstantRange::getNonEmpty(std::move(Min), std::move(Max) + 1);
 }
 
 ConstantRange


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D156845.546361.patch
Type: text/x-patch
Size: 1835 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230802/086ae983/attachment.bin>


More information about the llvm-commits mailing list