InstCombine: X & -C != -C -> X <= u ~C
authorDavid Majnemer <david.majnemer@gmail.com>
Tue, 9 Jul 2013 08:09:32 +0000 (08:09 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Tue, 9 Jul 2013 08:09:32 +0000 (08:09 +0000)
Tests were added in r185910 somehow.

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

lib/Transforms/InstCombine/InstCombineCompares.cpp
test/Transforms/InstCombine/icmp.ll

index fd2b68a9ecdb8aeb0dee5ea2edcb02ce9f594282..e9f3458be983f876c56b8d76ab8fe77c7762cd15 100644 (file)
@@ -1277,6 +1277,15 @@ Instruction *InstCombiner::visitICmpInstWithInstAndIntCst(ICmpInst &ICI,
               return Res;
           }
     }
+
+    // X & -C == -C -> X >  u ~C
+    // X & -C != -C -> X <= u ~C
+    //   iff C is a power of 2
+    if (ICI.isEquality() && RHS == LHSI->getOperand(1) && (-RHSV).isPowerOf2())
+      return new ICmpInst(
+          ICI.getPredicate() == ICmpInst::ICMP_EQ ? ICmpInst::ICMP_UGT
+                                                  : ICmpInst::ICMP_ULE,
+          LHSI->getOperand(0), SubOne(RHS));
     break;
 
   case Instruction::Or: {
index fbf7f3d6c33bf478018d00f9d88a29d4f06d02b1..5dccde26dd2b7182cf5ccf3a755d8be8ddcd7cd8 100644 (file)
@@ -1164,46 +1164,6 @@ define i1 @icmp_sub_3_X_uge_2(i32 %X) {
   ret i1 %cmp
 }
 
-; CHECK: @icmp_add_X_-14_ult_2
-; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %X, -2
-; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[AND]], 14
-; CHECK-NEXT: ret i1 [[CMP]]
-define i1 @icmp_add_X_-14_ult_2(i32 %X) {
-  %add = add i32 %X, -14
-  %cmp = icmp ult i32 %add, 2
-  ret i1 %cmp
-}
-
-; CHECK: @icmp_sub_3_X_ult_2
-; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 %X, 1
-; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[OR]], 3
-; CHECK-NEXT: ret i1 [[CMP]]
-define i1 @icmp_sub_3_X_ult_2(i32 %X) {
-  %add = sub i32 3, %X
-  %cmp = icmp ult i32 %add, 2
-  ret i1 %cmp
-}
-
-; CHECK: @icmp_add_X_-14_uge_2
-; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %X, -2
-; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[AND]], 14
-; CHECK-NEXT: ret i1 [[CMP]]
-define i1 @icmp_add_X_-14_uge_2(i32 %X) {
-  %add = add i32 %X, -14
-  %cmp = icmp uge i32 %add, 2
-  ret i1 %cmp
-}
-
-; CHECK: @icmp_sub_3_X_uge_2
-; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 %X, 1
-; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[OR]], 3
-; CHECK-NEXT: ret i1 [[CMP]]
-define i1 @icmp_sub_3_X_uge_2(i32 %X) {
-  %add = sub i32 3, %X
-  %cmp = icmp uge i32 %add, 2
-  ret i1 %cmp
-}
-
 ; CHECK: @icmp_and_X_-16_eq-16
 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %X, -17
 ; CHECK-NEXT: ret i1 [[CMP]]