From 9af3d6f06f1c2b76ce62cd8b9a93d0981fda426e Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Thu, 20 Jun 2019 16:27:23 +0000 Subject: [PATCH] [InstCombine] add commuted variants for power-of-2 checks; NFC git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@363945 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/Transforms/InstCombine/ispow2.ll | 47 +++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/test/Transforms/InstCombine/ispow2.ll b/test/Transforms/InstCombine/ispow2.ll index 8ecc1856ba3..c71234755a0 100644 --- a/test/Transforms/InstCombine/ispow2.ll +++ b/test/Transforms/InstCombine/ispow2.ll @@ -105,6 +105,53 @@ define <2 x i1> @isnot_pow2or0_decrement_op_vec(<2 x i8> %x) { ret <2 x i1> %cmp } +define i1 @is_pow2or0_negate_op_commute1(i32 %p) { +; CHECK-LABEL: @is_pow2or0_negate_op_commute1( +; CHECK-NEXT: [[X:%.*]] = srem i32 42, [[P:%.*]] +; CHECK-NEXT: [[NEG:%.*]] = sub nsw i32 0, [[X]] +; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[NEG]] +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], [[X]] +; CHECK-NEXT: ret i1 [[CMP]] +; + %x = srem i32 42, %p ; thwart complexity-based canonicalization + %neg = sub i32 0, %x + %and = and i32 %x, %neg + %cmp = icmp eq i32 %and, %x + ret i1 %cmp +} + +; x can't be <= complexity of the 'neg' but >= complexity of the 'and'. + +define i1 @isnot_pow2or0_negate_op_commute2(i32 %p) { +; CHECK-LABEL: @isnot_pow2or0_negate_op_commute2( +; CHECK-NEXT: [[X:%.*]] = urem i32 42, [[P:%.*]] +; CHECK-NEXT: [[NEG:%.*]] = sub nsw i32 0, [[X]] +; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[NEG]] +; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[X]], [[AND]] +; CHECK-NEXT: ret i1 [[CMP]] +; + %x = urem i32 42, %p ; thwart complexity-based canonicalization + %neg = sub i32 0, %x + %and = and i32 %neg, %x + %cmp = icmp ne i32 %x, %and + ret i1 %cmp +} + +define i1 @isnot_pow2or0_negate_op_commute3(i32 %p) { +; CHECK-LABEL: @isnot_pow2or0_negate_op_commute3( +; CHECK-NEXT: [[X:%.*]] = urem i32 42, [[P:%.*]] +; CHECK-NEXT: [[NEG:%.*]] = sub nsw i32 0, [[X]] +; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[NEG]] +; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[X]], [[AND]] +; CHECK-NEXT: ret i1 [[CMP]] +; + %x = urem i32 42, %p ; thwart complexity-based canonicalization + %neg = sub i32 0, %x + %and = and i32 %x, %neg + %cmp = icmp ne i32 %x, %and + ret i1 %cmp +} + declare void @use(i32) define i1 @is_pow2or0_negate_op_extra_use1(i32 %x) { -- 2.50.1