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
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
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
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
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
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
%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
+}