]> granicus.if.org Git - llvm/commitdiff
[InstCombine] Remove 64-bit bit width restriction from m_ConstantInt(uint64_t*&)
authorCraig Topper <craig.topper@gmail.com>
Wed, 28 Jun 2017 18:07:29 +0000 (18:07 +0000)
committerCraig Topper <craig.topper@gmail.com>
Wed, 28 Jun 2017 18:07:29 +0000 (18:07 +0000)
I think we only need to make sure the value fits in 64-bits not that bit width is 64-bit.

This helps places that use this for shift amounts since the shift amount needs to be the same bitwidth as the LHS, but can't be larger than the bit width.

Differential Revision: https://reviews.llvm.org/D34737

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306577 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/IR/PatternMatch.h
test/Transforms/InstCombine/icmp.ll

index 6f6d28602d7c7328d4a194e405f71268e82cdc1c..0450876c46734ebb16c6546296668c34aee53894 100644 (file)
@@ -402,7 +402,7 @@ struct bind_const_intval_ty {
 
   template <typename ITy> bool match(ITy *V) {
     if (const auto *CV = dyn_cast<ConstantInt>(V))
-      if (CV->getBitWidth() <= 64) {
+      if (CV->getValue().ule(UINT64_MAX)) {
         VR = CV->getZExtValue();
         return true;
       }
index 03a9f527555374c5983134bd26a54000f7925bab..b12ee917a82d66723717eb4628c01e79f1c6fcbb 100644 (file)
@@ -762,16 +762,11 @@ define i1 @test52(i32 %x1) {
   ret i1 %A
 }
 
-; TODO we have a 64-bit or less restriction in the handling for this pattern. We should remove that and do the same thing we do above.
 define i1 @test52b(i128 %x1) {
 ; CHECK-LABEL: @test52b(
-; CHECK-NEXT:    [[CONV:%.*]] = and i128 [[X1:%.*]], 255
-; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i128 [[CONV]], 127
-; CHECK-NEXT:    [[TMP2:%.*]] = lshr i128 [[X1]], 16
-; CHECK-NEXT:    [[TMP3:%.*]] = trunc i128 [[TMP2]] to i8
-; CHECK-NEXT:    [[CMP15:%.*]] = icmp eq i8 [[TMP3]], 76
-; CHECK-NEXT:    [[A:%.*]] = and i1 [[CMP]], [[CMP15]]
-; CHECK-NEXT:    ret i1 [[A]]
+; CHECK-NEXT:    [[TMP1:%.*]] = and i128 [[X1:%.*]], 16711935
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i128 [[TMP1]], 4980863
+; CHECK-NEXT:    ret i1 [[TMP2]]
 ;
   %conv = and i128 %x1, 255
   %cmp = icmp eq i128 %conv, 127