]> granicus.if.org Git - llvm/commitdiff
[InstCombine] add commuted variants for power-of-2 checks; NFC
authorSanjay Patel <spatel@rotateright.com>
Thu, 20 Jun 2019 16:27:23 +0000 (16:27 +0000)
committerSanjay Patel <spatel@rotateright.com>
Thu, 20 Jun 2019 16:27:23 +0000 (16:27 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@363945 91177308-0d34-0410-b5e6-96231b3b80d8

test/Transforms/InstCombine/ispow2.ll

index 8ecc1856ba3d9c8dc06e0a97495f9ef2c18682bb..c71234755a0cd53c2b667647cada03c1a6d20d0c 100644 (file)
@@ -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) {