From 36b6f7409d9f607317de9815ffc10656b608eab7 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Tue, 9 Jul 2013 08:09:32 +0000 Subject: [PATCH] InstCombine: X & -C != -C -> X <= u ~C Tests were added in r185910 somehow. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185912 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../InstCombine/InstCombineCompares.cpp | 9 +++++ test/Transforms/InstCombine/icmp.ll | 40 ------------------- 2 files changed, 9 insertions(+), 40 deletions(-) diff --git a/lib/Transforms/InstCombine/InstCombineCompares.cpp b/lib/Transforms/InstCombine/InstCombineCompares.cpp index fd2b68a9ecd..e9f3458be98 100644 --- a/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -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: { diff --git a/test/Transforms/InstCombine/icmp.ll b/test/Transforms/InstCombine/icmp.ll index fbf7f3d6c33..5dccde26dd2 100644 --- a/test/Transforms/InstCombine/icmp.ll +++ b/test/Transforms/InstCombine/icmp.ll @@ -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]]