[InstCombine] Add tests for and/or of range checks (NFC)
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 9 Nov 2021 20:59:40 +0000 (21:59 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 9 Nov 2021 21:06:02 +0000 (22:06 +0100)
llvm/test/Transforms/InstCombine/and-or-icmps.ll

index a9c5d2b..7fae2b6 100644 (file)
@@ -580,9 +580,9 @@ define i1 @PR42691_7_logical(i32 %x) {
 
 define i1 @PR42691_8(i32 %x) {
 ; CHECK-LABEL: @PR42691_8(
-; CHECK-NEXT:    [[X_OFF:%.*]] = add i32 [[X:%.*]], 2147483647
-; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 [[X_OFF]], -2147483635
-; CHECK-NEXT:    ret i1 [[TMP1]]
+; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X:%.*]], 2147483647
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -2147483635
+; CHECK-NEXT:    ret i1 [[TMP2]]
 ;
   %c1 = icmp slt i32 %x, 14
   %c2 = icmp ne i32 %x, -2147483648
@@ -592,9 +592,9 @@ define i1 @PR42691_8(i32 %x) {
 
 define i1 @PR42691_8_logical(i32 %x) {
 ; CHECK-LABEL: @PR42691_8_logical(
-; CHECK-NEXT:    [[X_OFF:%.*]] = add i32 [[X:%.*]], 2147483647
-; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 [[X_OFF]], -2147483635
-; CHECK-NEXT:    ret i1 [[TMP1]]
+; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X:%.*]], 2147483647
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -2147483635
+; CHECK-NEXT:    ret i1 [[TMP2]]
 ;
   %c1 = icmp slt i32 %x, 14
   %c2 = icmp ne i32 %x, -2147483648
@@ -604,9 +604,9 @@ define i1 @PR42691_8_logical(i32 %x) {
 
 define i1 @PR42691_9(i32 %x) {
 ; CHECK-LABEL: @PR42691_9(
-; CHECK-NEXT:    [[X_OFF:%.*]] = add i32 [[X:%.*]], -14
-; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 [[X_OFF]], 2147483633
-; CHECK-NEXT:    ret i1 [[TMP1]]
+; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X:%.*]], -14
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i32 [[TMP1]], 2147483633
+; CHECK-NEXT:    ret i1 [[TMP2]]
 ;
   %c1 = icmp sgt i32 %x, 13
   %c2 = icmp ne i32 %x, 2147483647
@@ -616,9 +616,9 @@ define i1 @PR42691_9(i32 %x) {
 
 define i1 @PR42691_9_logical(i32 %x) {
 ; CHECK-LABEL: @PR42691_9_logical(
-; CHECK-NEXT:    [[X_OFF:%.*]] = add i32 [[X:%.*]], -14
-; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 [[X_OFF]], 2147483633
-; CHECK-NEXT:    ret i1 [[TMP1]]
+; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X:%.*]], -14
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i32 [[TMP1]], 2147483633
+; CHECK-NEXT:    ret i1 [[TMP2]]
 ;
   %c1 = icmp sgt i32 %x, 13
   %c2 = icmp ne i32 %x, 2147483647
@@ -628,9 +628,9 @@ define i1 @PR42691_9_logical(i32 %x) {
 
 define i1 @PR42691_10(i32 %x) {
 ; CHECK-LABEL: @PR42691_10(
-; CHECK-NEXT:    [[X_OFF:%.*]] = add i32 [[X:%.*]], -14
-; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 [[X_OFF]], -15
-; CHECK-NEXT:    ret i1 [[TMP1]]
+; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X:%.*]], -14
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -15
+; CHECK-NEXT:    ret i1 [[TMP2]]
 ;
   %c1 = icmp ugt i32 %x, 13
   %c2 = icmp ne i32 %x, 4294967295
@@ -640,9 +640,9 @@ define i1 @PR42691_10(i32 %x) {
 
 define i1 @PR42691_10_logical(i32 %x) {
 ; CHECK-LABEL: @PR42691_10_logical(
-; CHECK-NEXT:    [[X_OFF:%.*]] = add i32 [[X:%.*]], -14
-; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 [[X_OFF]], -15
-; CHECK-NEXT:    ret i1 [[TMP1]]
+; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X:%.*]], -14
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -15
+; CHECK-NEXT:    ret i1 [[TMP2]]
 ;
   %c1 = icmp ugt i32 %x, 13
   %c2 = icmp ne i32 %x, 4294967295
@@ -1043,3 +1043,147 @@ define i1 @substitute_constant_or_ne_ule_use2_logical(i8 %x, i8 %y) {
   %r = select i1 %c2, i1 true, i1 %c1
   ret i1 %r
 }
+
+define i1 @or_ranges_overlap(i8 %x) {
+; CHECK-LABEL: @or_ranges_overlap(
+; CHECK-NEXT:    [[TMP1:%.*]] = add i8 [[X:%.*]], -5
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i8 [[TMP1]], 6
+; CHECK-NEXT:    [[TMP3:%.*]] = add i8 [[X]], -10
+; CHECK-NEXT:    [[TMP4:%.*]] = icmp ult i8 [[TMP3]], 11
+; CHECK-NEXT:    [[C7:%.*]] = or i1 [[TMP2]], [[TMP4]]
+; CHECK-NEXT:    ret i1 [[C7]]
+;
+  %c1 = icmp uge i8 %x, 5
+  %c2 = icmp ule i8 %x, 10
+  %c3 = and i1 %c1, %c2
+  %c4 = icmp uge i8 %x, 10
+  %c5 = icmp ule i8 %x, 20
+  %c6 = and i1 %c4, %c5
+  %c7 = or i1 %c3, %c6
+  ret i1 %c7
+}
+
+define i1 @or_ranges_adjacent(i8 %x) {
+; CHECK-LABEL: @or_ranges_adjacent(
+; CHECK-NEXT:    [[TMP1:%.*]] = add i8 [[X:%.*]], -5
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i8 [[TMP1]], 6
+; CHECK-NEXT:    [[TMP3:%.*]] = add i8 [[X]], -11
+; CHECK-NEXT:    [[TMP4:%.*]] = icmp ult i8 [[TMP3]], 10
+; CHECK-NEXT:    [[C7:%.*]] = or i1 [[TMP2]], [[TMP4]]
+; CHECK-NEXT:    ret i1 [[C7]]
+;
+  %c1 = icmp uge i8 %x, 5
+  %c2 = icmp ule i8 %x, 10
+  %c3 = and i1 %c1, %c2
+  %c4 = icmp uge i8 %x, 11
+  %c5 = icmp ule i8 %x, 20
+  %c6 = and i1 %c4, %c5
+  %c7 = or i1 %c3, %c6
+  ret i1 %c7
+}
+
+define i1 @or_ranges_separated(i8 %x) {
+; CHECK-LABEL: @or_ranges_separated(
+; CHECK-NEXT:    [[TMP1:%.*]] = add i8 [[X:%.*]], -5
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i8 [[TMP1]], 6
+; CHECK-NEXT:    [[TMP3:%.*]] = add i8 [[X]], -12
+; CHECK-NEXT:    [[TMP4:%.*]] = icmp ult i8 [[TMP3]], 9
+; CHECK-NEXT:    [[C7:%.*]] = or i1 [[TMP2]], [[TMP4]]
+; CHECK-NEXT:    ret i1 [[C7]]
+;
+  %c1 = icmp uge i8 %x, 5
+  %c2 = icmp ule i8 %x, 10
+  %c3 = and i1 %c1, %c2
+  %c4 = icmp uge i8 %x, 12
+  %c5 = icmp ule i8 %x, 20
+  %c6 = and i1 %c4, %c5
+  %c7 = or i1 %c3, %c6
+  ret i1 %c7
+}
+
+define i1 @or_ranges_single_elem_right(i8 %x) {
+; CHECK-LABEL: @or_ranges_single_elem_right(
+; CHECK-NEXT:    [[TMP1:%.*]] = add i8 [[X:%.*]], -5
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i8 [[TMP1]], 7
+; CHECK-NEXT:    ret i1 [[TMP2]]
+;
+  %c1 = icmp uge i8 %x, 5
+  %c2 = icmp ule i8 %x, 10
+  %c3 = and i1 %c1, %c2
+  %c4 = icmp eq i8 %x, 11
+  %c6 = or i1 %c3, %c4
+  ret i1 %c6
+}
+
+define i1 @or_ranges_single_elem_left(i8 %x) {
+; CHECK-LABEL: @or_ranges_single_elem_left(
+; CHECK-NEXT:    [[TMP1:%.*]] = add i8 [[X:%.*]], -5
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i8 [[TMP1]], 6
+; CHECK-NEXT:    [[C4:%.*]] = icmp eq i8 [[X]], 4
+; CHECK-NEXT:    [[C6:%.*]] = or i1 [[TMP2]], [[C4]]
+; CHECK-NEXT:    ret i1 [[C6]]
+;
+  %c1 = icmp uge i8 %x, 5
+  %c2 = icmp ule i8 %x, 10
+  %c3 = and i1 %c1, %c2
+  %c4 = icmp eq i8 %x, 4
+  %c6 = or i1 %c3, %c4
+  ret i1 %c6
+}
+
+define i1 @and_ranges_overlap(i8 %x) {
+; CHECK-LABEL: @and_ranges_overlap(
+; CHECK-NEXT:    [[TMP1:%.*]] = add i8 [[X:%.*]], -5
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i8 [[TMP1]], 6
+; CHECK-NEXT:    [[TMP3:%.*]] = add i8 [[X]], -7
+; CHECK-NEXT:    [[TMP4:%.*]] = icmp ult i8 [[TMP3]], 14
+; CHECK-NEXT:    [[C7:%.*]] = and i1 [[TMP2]], [[TMP4]]
+; CHECK-NEXT:    ret i1 [[C7]]
+;
+  %c1 = icmp uge i8 %x, 5
+  %c2 = icmp ule i8 %x, 10
+  %c3 = and i1 %c1, %c2
+  %c4 = icmp uge i8 %x, 7
+  %c5 = icmp ule i8 %x, 20
+  %c6 = and i1 %c4, %c5
+  %c7 = and i1 %c3, %c6
+  ret i1 %c7
+}
+
+define i1 @and_ranges_overlap_single(i8 %x) {
+; CHECK-LABEL: @and_ranges_overlap_single(
+; CHECK-NEXT:    [[TMP1:%.*]] = add i8 [[X:%.*]], -5
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i8 [[TMP1]], 6
+; CHECK-NEXT:    [[TMP3:%.*]] = add i8 [[X]], -10
+; CHECK-NEXT:    [[TMP4:%.*]] = icmp ult i8 [[TMP3]], 11
+; CHECK-NEXT:    [[C7:%.*]] = and i1 [[TMP2]], [[TMP4]]
+; CHECK-NEXT:    ret i1 [[C7]]
+;
+  %c1 = icmp uge i8 %x, 5
+  %c2 = icmp ule i8 %x, 10
+  %c3 = and i1 %c1, %c2
+  %c4 = icmp uge i8 %x, 10
+  %c5 = icmp ule i8 %x, 20
+  %c6 = and i1 %c4, %c5
+  %c7 = and i1 %c3, %c6
+  ret i1 %c7
+}
+
+define i1 @and_ranges_no_overlap(i8 %x) {
+; CHECK-LABEL: @and_ranges_no_overlap(
+; CHECK-NEXT:    [[TMP1:%.*]] = add i8 [[X:%.*]], -5
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i8 [[TMP1]], 6
+; CHECK-NEXT:    [[TMP3:%.*]] = add i8 [[X]], -11
+; CHECK-NEXT:    [[TMP4:%.*]] = icmp ult i8 [[TMP3]], 10
+; CHECK-NEXT:    [[C7:%.*]] = and i1 [[TMP2]], [[TMP4]]
+; CHECK-NEXT:    ret i1 [[C7]]
+;
+  %c1 = icmp uge i8 %x, 5
+  %c2 = icmp ule i8 %x, 10
+  %c3 = and i1 %c1, %c2
+  %c4 = icmp uge i8 %x, 11
+  %c5 = icmp ule i8 %x, 20
+  %c6 = and i1 %c4, %c5
+  %c7 = and i1 %c3, %c6
+  ret i1 %c7
+}