[llvm] r322323 - [InstSimplify] add tests for implied cmp with zero (PR35790); NFC

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 11 14:48:07 PST 2018


Author: spatel
Date: Thu Jan 11 14:48:07 2018
New Revision: 322323

URL: http://llvm.org/viewvc/llvm-project?rev=322323&view=rev
Log:
[InstSimplify] add tests for implied cmp with zero (PR35790); NFC

Added:
    llvm/trunk/test/Transforms/InstSimplify/and-or-icmp-zero.ll

Added: llvm/trunk/test/Transforms/InstSimplify/and-or-icmp-zero.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstSimplify/and-or-icmp-zero.ll?rev=322323&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/InstSimplify/and-or-icmp-zero.ll (added)
+++ llvm/trunk/test/Transforms/InstSimplify/and-or-icmp-zero.ll Thu Jan 11 14:48:07 2018
@@ -0,0 +1,142 @@
+; RUN: opt < %s -instsimplify -S | FileCheck %s
+
+; In the next 8 tests (4 commutes * 2 (and/or)), eliminate the simple (not) null
+; check because that compare is implied by the masked compare of the same operand.
+; Vary types between scalar and vector and weird for extra coverage.
+
+; or (icmp eq (and X, ?), 0), (icmp eq X, 0) --> icmp eq (and X, ?), 0
+
+define i1 @or_cmps_eq_zero_with_mask_commute1(i64 %x, i64 %y) {
+; CHECK-LABEL: @or_cmps_eq_zero_with_mask_commute1(
+; CHECK-NEXT:    [[ISNULL:%.*]] = icmp eq i64 %x, 0
+; CHECK-NEXT:    [[SOMEBITS:%.*]] = and i64 %x, %y
+; CHECK-NEXT:    [[SOMEBITS_ARE_ZERO:%.*]] = icmp eq i64 [[SOMEBITS]], 0
+; CHECK-NEXT:    [[R:%.*]] = or i1 [[SOMEBITS_ARE_ZERO]], [[ISNULL]]
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %isnull = icmp eq i64 %x, 0
+  %somebits = and i64 %x, %y
+  %somebits_are_zero = icmp eq i64 %somebits, 0
+  %r = or i1 %somebits_are_zero, %isnull
+  ret i1 %r
+}
+
+; or (icmp eq X, 0), (icmp eq (and X, ?), 0) --> icmp eq (and X, ?), 0
+
+define <2 x i1> @or_cmps_eq_zero_with_mask_commute2(<2 x i64> %x, <2 x i64> %y) {
+; CHECK-LABEL: @or_cmps_eq_zero_with_mask_commute2(
+; CHECK-NEXT:    [[ISNULL:%.*]] = icmp eq <2 x i64> %x, zeroinitializer
+; CHECK-NEXT:    [[SOMEBITS:%.*]] = and <2 x i64> %x, %y
+; CHECK-NEXT:    [[SOMEBITS_ARE_ZERO:%.*]] = icmp eq <2 x i64> [[SOMEBITS]], zeroinitializer
+; CHECK-NEXT:    [[R:%.*]] = or <2 x i1> [[ISNULL]], [[SOMEBITS_ARE_ZERO]]
+; CHECK-NEXT:    ret <2 x i1> [[R]]
+;
+  %isnull = icmp eq <2 x i64> %x, zeroinitializer
+  %somebits = and <2 x i64> %x, %y
+  %somebits_are_zero = icmp eq <2 x i64> %somebits, zeroinitializer
+  %r = or <2 x i1> %isnull, %somebits_are_zero
+  ret <2 x i1> %r
+}
+
+; or (icmp eq (and ?, X), 0), (icmp eq X, 0) --> icmp eq (and ?, X), 0
+
+define i1 @or_cmps_eq_zero_with_mask_commute3(i4 %x, i4 %y) {
+; CHECK-LABEL: @or_cmps_eq_zero_with_mask_commute3(
+; CHECK-NEXT:    [[ISNULL:%.*]] = icmp eq i4 %x, 0
+; CHECK-NEXT:    [[SOMEBITS:%.*]] = and i4 %y, %x
+; CHECK-NEXT:    [[SOMEBITS_ARE_ZERO:%.*]] = icmp eq i4 [[SOMEBITS]], 0
+; CHECK-NEXT:    [[R:%.*]] = or i1 [[SOMEBITS_ARE_ZERO]], [[ISNULL]]
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %isnull = icmp eq i4 %x, 0
+  %somebits = and i4 %y, %x
+  %somebits_are_zero = icmp eq i4 %somebits, 0
+  %r = or i1 %somebits_are_zero, %isnull
+  ret i1 %r
+}
+
+; or (icmp eq X, 0), (icmp eq (and ?, X), 0) --> icmp eq (and ?, X), 0
+
+define <2 x i1> @or_cmps_eq_zero_with_mask_commute4(<2 x i4> %x, <2 x i4> %y) {
+; CHECK-LABEL: @or_cmps_eq_zero_with_mask_commute4(
+; CHECK-NEXT:    [[ISNULL:%.*]] = icmp eq <2 x i4> %x, zeroinitializer
+; CHECK-NEXT:    [[SOMEBITS:%.*]] = and <2 x i4> %y, %x
+; CHECK-NEXT:    [[SOMEBITS_ARE_ZERO:%.*]] = icmp eq <2 x i4> [[SOMEBITS]], zeroinitializer
+; CHECK-NEXT:    [[R:%.*]] = or <2 x i1> [[ISNULL]], [[SOMEBITS_ARE_ZERO]]
+; CHECK-NEXT:    ret <2 x i1> [[R]]
+;
+  %isnull = icmp eq <2 x i4> %x, zeroinitializer
+  %somebits = and <2 x i4> %y, %x
+  %somebits_are_zero = icmp eq <2 x i4> %somebits, zeroinitializer
+  %r = or <2 x i1> %isnull, %somebits_are_zero
+  ret <2 x i1> %r
+}
+
+; and (icmp ne (and X, ?), 0), (icmp ne X, 0) --> icmp ne (and X, ?), 0
+
+define <3 x i1> @and_cmps_eq_zero_with_mask_commute1(<3 x i4> %x, <3 x i4> %y) {
+; CHECK-LABEL: @and_cmps_eq_zero_with_mask_commute1(
+; CHECK-NEXT:    [[ISNOTNULL:%.*]] = icmp ne <3 x i4> %x, zeroinitializer
+; CHECK-NEXT:    [[SOMEBITS:%.*]] = and <3 x i4> %x, %y
+; CHECK-NEXT:    [[SOMEBITS_ARE_NOT_ZERO:%.*]] = icmp ne <3 x i4> [[SOMEBITS]], zeroinitializer
+; CHECK-NEXT:    [[R:%.*]] = and <3 x i1> [[SOMEBITS_ARE_NOT_ZERO]], [[ISNOTNULL]]
+; CHECK-NEXT:    ret <3 x i1> [[R]]
+;
+  %isnotnull = icmp ne <3 x i4> %x, zeroinitializer
+  %somebits = and <3 x i4> %x, %y
+  %somebits_are_not_zero = icmp ne <3 x i4> %somebits, zeroinitializer
+  %r = and <3 x i1> %somebits_are_not_zero, %isnotnull
+  ret <3 x i1> %r
+}
+
+; and (icmp ne X, 0), (icmp ne (and X, ?), 0) --> icmp ne (and X, ?), 0
+
+define i1 @and_cmps_eq_zero_with_mask_commute2(i4 %x, i4 %y) {
+; CHECK-LABEL: @and_cmps_eq_zero_with_mask_commute2(
+; CHECK-NEXT:    [[ISNOTNULL:%.*]] = icmp ne i4 %x, 0
+; CHECK-NEXT:    [[SOMEBITS:%.*]] = and i4 %x, %y
+; CHECK-NEXT:    [[SOMEBITS_ARE_NOT_ZERO:%.*]] = icmp ne i4 [[SOMEBITS]], 0
+; CHECK-NEXT:    [[R:%.*]] = and i1 [[ISNOTNULL]], [[SOMEBITS_ARE_NOT_ZERO]]
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %isnotnull = icmp ne i4 %x, 0
+  %somebits = and i4 %x, %y
+  %somebits_are_not_zero = icmp ne i4 %somebits, 0
+  %r = and i1 %isnotnull, %somebits_are_not_zero
+  ret i1 %r
+}
+
+; and (icmp ne (and ?, X), 0), (icmp ne X, 0) --> icmp ne (and ?, X), 0
+
+define <3 x i1> @and_cmps_eq_zero_with_mask_commute3(<3 x i64> %x, <3 x i64> %y) {
+; CHECK-LABEL: @and_cmps_eq_zero_with_mask_commute3(
+; CHECK-NEXT:    [[ISNOTNULL:%.*]] = icmp ne <3 x i64> %x, zeroinitializer
+; CHECK-NEXT:    [[SOMEBITS:%.*]] = and <3 x i64> %y, %x
+; CHECK-NEXT:    [[SOMEBITS_ARE_NOT_ZERO:%.*]] = icmp ne <3 x i64> [[SOMEBITS]], zeroinitializer
+; CHECK-NEXT:    [[R:%.*]] = and <3 x i1> [[SOMEBITS_ARE_NOT_ZERO]], [[ISNOTNULL]]
+; CHECK-NEXT:    ret <3 x i1> [[R]]
+;
+  %isnotnull = icmp ne <3 x i64> %x, zeroinitializer
+  %somebits = and <3 x i64> %y, %x
+  %somebits_are_not_zero = icmp ne <3 x i64> %somebits, zeroinitializer
+  %r = and <3 x i1> %somebits_are_not_zero, %isnotnull
+  ret <3 x i1> %r
+}
+
+; and (icmp ne X, 0), (icmp ne (and ?, X), 0) --> icmp ne (and ?, X), 0
+
+define i1 @and_cmps_eq_zero_with_mask_commute4(i64 %x, i64 %y) {
+; CHECK-LABEL: @and_cmps_eq_zero_with_mask_commute4(
+; CHECK-NEXT:    [[ISNOTNULL:%.*]] = icmp ne i64 %x, 0
+; CHECK-NEXT:    [[SOMEBITS:%.*]] = and i64 %y, %x
+; CHECK-NEXT:    [[SOMEBITS_ARE_NOT_ZERO:%.*]] = icmp ne i64 [[SOMEBITS]], 0
+; CHECK-NEXT:    [[R:%.*]] = and i1 [[ISNOTNULL]], [[SOMEBITS_ARE_NOT_ZERO]]
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %isnotnull = icmp ne i64 %x, 0
+  %somebits = and i64 %y, %x
+  %somebits_are_not_zero = icmp ne i64 %somebits, 0
+  %r = and i1 %isnotnull, %somebits_are_not_zero
+  ret i1 %r
+}
+




More information about the llvm-commits mailing list