2101 lines
		
	
	
		
			67 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			2101 lines
		
	
	
		
			67 KiB
		
	
	
	
		
			LLVM
		
	
	
	
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
 | 
						|
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
 | 
						|
 | 
						|
declare void @use(i1)
 | 
						|
 | 
						|
define i1 @PR1817_1(i32 %X) {
 | 
						|
; CHECK-LABEL: @PR1817_1(
 | 
						|
; CHECK-NEXT:    [[B:%.*]] = icmp ult i32 [[X:%.*]], 10
 | 
						|
; CHECK-NEXT:    ret i1 [[B]]
 | 
						|
;
 | 
						|
  %A = icmp slt i32 %X, 10
 | 
						|
  %B = icmp ult i32 %X, 10
 | 
						|
  %C = and i1 %A, %B
 | 
						|
  ret i1 %C
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR1817_1_logical(i32 %X) {
 | 
						|
; CHECK-LABEL: @PR1817_1_logical(
 | 
						|
; CHECK-NEXT:    [[B:%.*]] = icmp ult i32 [[X:%.*]], 10
 | 
						|
; CHECK-NEXT:    ret i1 [[B]]
 | 
						|
;
 | 
						|
  %A = icmp slt i32 %X, 10
 | 
						|
  %B = icmp ult i32 %X, 10
 | 
						|
  %C = select i1 %A, i1 %B, i1 false
 | 
						|
  ret i1 %C
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR1817_2(i32 %X) {
 | 
						|
; CHECK-LABEL: @PR1817_2(
 | 
						|
; CHECK-NEXT:    [[A:%.*]] = icmp slt i32 [[X:%.*]], 10
 | 
						|
; CHECK-NEXT:    ret i1 [[A]]
 | 
						|
;
 | 
						|
  %A = icmp slt i32 %X, 10
 | 
						|
  %B = icmp ult i32 %X, 10
 | 
						|
  %C = or i1 %A, %B
 | 
						|
  ret i1 %C
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR1817_2_logical(i32 %X) {
 | 
						|
; CHECK-LABEL: @PR1817_2_logical(
 | 
						|
; CHECK-NEXT:    [[A:%.*]] = icmp slt i32 [[X:%.*]], 10
 | 
						|
; CHECK-NEXT:    ret i1 [[A]]
 | 
						|
;
 | 
						|
  %A = icmp slt i32 %X, 10
 | 
						|
  %B = icmp ult i32 %X, 10
 | 
						|
  %C = select i1 %A, i1 true, i1 %B
 | 
						|
  ret i1 %C
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR2330(i32 %a, i32 %b) {
 | 
						|
; CHECK-LABEL: @PR2330(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = or i32 [[B:%.*]], [[A:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i32 [[TMP1]], 8
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp ult i32 %a, 8
 | 
						|
  %cmp2 = icmp ult i32 %b, 8
 | 
						|
  %and = and i1 %cmp2, %cmp1
 | 
						|
  ret i1 %and
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR2330_logical(i32 %a, i32 %b) {
 | 
						|
; CHECK-LABEL: @PR2330_logical(
 | 
						|
; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i32 [[A:%.*]], 8
 | 
						|
; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i32 [[B:%.*]], 8
 | 
						|
; CHECK-NEXT:    [[AND:%.*]] = select i1 [[CMP2]], i1 [[CMP1]], i1 false
 | 
						|
; CHECK-NEXT:    ret i1 [[AND]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp ult i32 %a, 8
 | 
						|
  %cmp2 = icmp ult i32 %b, 8
 | 
						|
  %and = select i1 %cmp2, i1 %cmp1, i1 false
 | 
						|
  ret i1 %and
 | 
						|
}
 | 
						|
 | 
						|
; if LHSC and RHSC differ only by one bit:
 | 
						|
; (X == C1 || X == C2) -> (X & ~(C1 ^ C2)) == C1 (C1 has 1 less set bit)
 | 
						|
; PR14708: https://bugs.llvm.org/show_bug.cgi?id=14708
 | 
						|
 | 
						|
define i1 @or_eq_with_one_bit_diff_constants1(i32 %x) {
 | 
						|
; CHECK-LABEL: @or_eq_with_one_bit_diff_constants1(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], -2
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 50
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp eq i32 %x, 50
 | 
						|
  %cmp2 = icmp eq i32 %x, 51
 | 
						|
  %or = or i1 %cmp1, %cmp2
 | 
						|
  ret i1 %or
 | 
						|
}
 | 
						|
 | 
						|
define i1 @or_eq_with_one_bit_diff_constants1_logical(i32 %x) {
 | 
						|
; CHECK-LABEL: @or_eq_with_one_bit_diff_constants1_logical(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], -2
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 50
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp eq i32 %x, 50
 | 
						|
  %cmp2 = icmp eq i32 %x, 51
 | 
						|
  %or = select i1 %cmp1, i1 true, i1 %cmp2
 | 
						|
  ret i1 %or
 | 
						|
}
 | 
						|
 | 
						|
; (X != C1 && X != C2) -> (X & ~(C1 ^ C2)) != C1 (C1 has 1 less set bit)
 | 
						|
 | 
						|
define i1 @and_ne_with_one_bit_diff_constants1(i32 %x) {
 | 
						|
; CHECK-LABEL: @and_ne_with_one_bit_diff_constants1(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X:%.*]], -52
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -2
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp ne i32 %x, 51
 | 
						|
  %cmp2 = icmp ne i32 %x, 50
 | 
						|
  %and = and i1 %cmp1, %cmp2
 | 
						|
  ret i1 %and
 | 
						|
}
 | 
						|
 | 
						|
define i1 @and_ne_with_one_bit_diff_constants1_logical(i32 %x) {
 | 
						|
; CHECK-LABEL: @and_ne_with_one_bit_diff_constants1_logical(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X:%.*]], -52
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -2
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp ne i32 %x, 51
 | 
						|
  %cmp2 = icmp ne i32 %x, 50
 | 
						|
  %and = select i1 %cmp1, i1 %cmp2, i1 false
 | 
						|
  ret i1 %and
 | 
						|
}
 | 
						|
 | 
						|
; The constants are not necessarily off-by-one, just off-by-one-bit.
 | 
						|
 | 
						|
define i1 @or_eq_with_one_bit_diff_constants2(i32 %x) {
 | 
						|
; CHECK-LABEL: @or_eq_with_one_bit_diff_constants2(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], -33
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 65
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp eq i32 %x, 97
 | 
						|
  %cmp2 = icmp eq i32 %x, 65
 | 
						|
  %or = or i1 %cmp1, %cmp2
 | 
						|
  ret i1 %or
 | 
						|
}
 | 
						|
 | 
						|
define i1 @or_eq_with_one_bit_diff_constants2_logical(i32 %x) {
 | 
						|
; CHECK-LABEL: @or_eq_with_one_bit_diff_constants2_logical(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], -33
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 65
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp eq i32 %x, 97
 | 
						|
  %cmp2 = icmp eq i32 %x, 65
 | 
						|
  %or = select i1 %cmp1, i1 true, i1 %cmp2
 | 
						|
  ret i1 %or
 | 
						|
}
 | 
						|
 | 
						|
define i1 @and_ne_with_one_bit_diff_constants2(i19 %x) {
 | 
						|
; CHECK-LABEL: @and_ne_with_one_bit_diff_constants2(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = and i19 [[X:%.*]], -129
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i19 [[TMP1]], 65
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp ne i19 %x, 65
 | 
						|
  %cmp2 = icmp ne i19 %x, 193
 | 
						|
  %and = and i1 %cmp1, %cmp2
 | 
						|
  ret i1 %and
 | 
						|
}
 | 
						|
 | 
						|
define i1 @and_ne_with_one_bit_diff_constants2_logical(i19 %x) {
 | 
						|
; CHECK-LABEL: @and_ne_with_one_bit_diff_constants2_logical(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = and i19 [[X:%.*]], -129
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i19 [[TMP1]], 65
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp ne i19 %x, 65
 | 
						|
  %cmp2 = icmp ne i19 %x, 193
 | 
						|
  %and = select i1 %cmp1, i1 %cmp2, i1 false
 | 
						|
  ret i1 %and
 | 
						|
}
 | 
						|
 | 
						|
; Make sure the constants are treated as unsigned when comparing them.
 | 
						|
 | 
						|
define i1 @or_eq_with_one_bit_diff_constants3(i8 %x) {
 | 
						|
; CHECK-LABEL: @or_eq_with_one_bit_diff_constants3(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = and i8 [[X:%.*]], 127
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 126
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp eq i8 %x, 254
 | 
						|
  %cmp2 = icmp eq i8 %x, 126
 | 
						|
  %or = or i1 %cmp1, %cmp2
 | 
						|
  ret i1 %or
 | 
						|
}
 | 
						|
 | 
						|
define i1 @or_eq_with_one_bit_diff_constants3_logical(i8 %x) {
 | 
						|
; CHECK-LABEL: @or_eq_with_one_bit_diff_constants3_logical(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = and i8 [[X:%.*]], 127
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 126
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp eq i8 %x, 254
 | 
						|
  %cmp2 = icmp eq i8 %x, 126
 | 
						|
  %or = select i1 %cmp1, i1 true, i1 %cmp2
 | 
						|
  ret i1 %or
 | 
						|
}
 | 
						|
 | 
						|
define i1 @and_ne_with_one_bit_diff_constants3(i8 %x) {
 | 
						|
; CHECK-LABEL: @and_ne_with_one_bit_diff_constants3(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = and i8 [[X:%.*]], 127
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i8 [[TMP1]], 65
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp ne i8 %x, 65
 | 
						|
  %cmp2 = icmp ne i8 %x, 193
 | 
						|
  %and = and i1 %cmp1, %cmp2
 | 
						|
  ret i1 %and
 | 
						|
}
 | 
						|
 | 
						|
define i1 @and_ne_with_one_bit_diff_constants3_logical(i8 %x) {
 | 
						|
; CHECK-LABEL: @and_ne_with_one_bit_diff_constants3_logical(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = and i8 [[X:%.*]], 127
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i8 [[TMP1]], 65
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp ne i8 %x, 65
 | 
						|
  %cmp2 = icmp ne i8 %x, 193
 | 
						|
  %and = select i1 %cmp1, i1 %cmp2, i1 false
 | 
						|
  ret i1 %and
 | 
						|
}
 | 
						|
 | 
						|
; Use an 'add' to eliminate an icmp if the constants are off-by-one (not off-by-one-bit).
 | 
						|
; (X == 13 | X == 14) -> X-13 <u 2
 | 
						|
 | 
						|
define i1 @or_eq_with_diff_one(i8 %x) {
 | 
						|
; CHECK-LABEL: @or_eq_with_diff_one(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = add i8 [[X:%.*]], -13
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i8 [[TMP1]], 2
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp eq i8 %x, 13
 | 
						|
  %cmp2 = icmp eq i8 %x, 14
 | 
						|
  %or = or i1 %cmp1, %cmp2
 | 
						|
  ret i1 %or
 | 
						|
}
 | 
						|
 | 
						|
define i1 @or_eq_with_diff_one_logical(i8 %x) {
 | 
						|
; CHECK-LABEL: @or_eq_with_diff_one_logical(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = add i8 [[X:%.*]], -13
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i8 [[TMP1]], 2
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp eq i8 %x, 13
 | 
						|
  %cmp2 = icmp eq i8 %x, 14
 | 
						|
  %or = select i1 %cmp1, i1 true, i1 %cmp2
 | 
						|
  ret i1 %or
 | 
						|
}
 | 
						|
 | 
						|
; (X != 40 | X != 39) -> X-39 >u 1
 | 
						|
 | 
						|
define i1 @and_ne_with_diff_one(i32 %x) {
 | 
						|
; CHECK-LABEL: @and_ne_with_diff_one(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X:%.*]], -41
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -2
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp ne i32 %x, 40
 | 
						|
  %cmp2 = icmp ne i32 %x, 39
 | 
						|
  %and = and i1 %cmp1, %cmp2
 | 
						|
  ret i1 %and
 | 
						|
}
 | 
						|
 | 
						|
define i1 @and_ne_with_diff_one_logical(i32 %x) {
 | 
						|
; CHECK-LABEL: @and_ne_with_diff_one_logical(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X:%.*]], -41
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -2
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp ne i32 %x, 40
 | 
						|
  %cmp2 = icmp ne i32 %x, 39
 | 
						|
  %and = select i1 %cmp1, i1 %cmp2, i1 false
 | 
						|
  ret i1 %and
 | 
						|
}
 | 
						|
 | 
						|
; Make sure the constants are treated as signed when comparing them.
 | 
						|
; PR32524: https://bugs.llvm.org/show_bug.cgi?id=32524
 | 
						|
 | 
						|
define i1 @or_eq_with_diff_one_signed(i32 %x) {
 | 
						|
; CHECK-LABEL: @or_eq_with_diff_one_signed(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X:%.*]], 1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i32 [[TMP1]], 2
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp eq i32 %x, 0
 | 
						|
  %cmp2 = icmp eq i32 %x, -1
 | 
						|
  %or = or i1 %cmp1, %cmp2
 | 
						|
  ret i1 %or
 | 
						|
}
 | 
						|
 | 
						|
define i1 @or_eq_with_diff_one_signed_logical(i32 %x) {
 | 
						|
; CHECK-LABEL: @or_eq_with_diff_one_signed_logical(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X:%.*]], 1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i32 [[TMP1]], 2
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp eq i32 %x, 0
 | 
						|
  %cmp2 = icmp eq i32 %x, -1
 | 
						|
  %or = select i1 %cmp1, i1 true, i1 %cmp2
 | 
						|
  ret i1 %or
 | 
						|
}
 | 
						|
 | 
						|
define i1 @and_ne_with_diff_one_signed(i64 %x) {
 | 
						|
; CHECK-LABEL: @and_ne_with_diff_one_signed(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = add i64 [[X:%.*]], -1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i64 [[TMP1]], -2
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp ne i64 %x, -1
 | 
						|
  %cmp2 = icmp ne i64 %x, 0
 | 
						|
  %and = and i1 %cmp1, %cmp2
 | 
						|
  ret i1 %and
 | 
						|
}
 | 
						|
 | 
						|
define i1 @and_ne_with_diff_one_signed_logical(i64 %x) {
 | 
						|
; CHECK-LABEL: @and_ne_with_diff_one_signed_logical(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = add i64 [[X:%.*]], -1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i64 [[TMP1]], -2
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp ne i64 %x, -1
 | 
						|
  %cmp2 = icmp ne i64 %x, 0
 | 
						|
  %and = select i1 %cmp1, i1 %cmp2, i1 false
 | 
						|
  ret i1 %and
 | 
						|
}
 | 
						|
 | 
						|
; Vectors with splat constants get the same folds.
 | 
						|
 | 
						|
define <2 x i1> @or_eq_with_one_bit_diff_constants2_splatvec(<2 x i32> %x) {
 | 
						|
; CHECK-LABEL: @or_eq_with_one_bit_diff_constants2_splatvec(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = and <2 x i32> [[X:%.*]], <i32 -33, i32 -33>
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq <2 x i32> [[TMP1]], <i32 65, i32 65>
 | 
						|
; CHECK-NEXT:    ret <2 x i1> [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp eq <2 x i32> %x, <i32 97, i32 97>
 | 
						|
  %cmp2 = icmp eq <2 x i32> %x, <i32 65, i32 65>
 | 
						|
  %or = or <2 x i1> %cmp1, %cmp2
 | 
						|
  ret <2 x i1> %or
 | 
						|
}
 | 
						|
 | 
						|
define <2 x i1> @and_ne_with_diff_one_splatvec(<2 x i32> %x) {
 | 
						|
; CHECK-LABEL: @and_ne_with_diff_one_splatvec(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = add <2 x i32> [[X:%.*]], <i32 -41, i32 -41>
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult <2 x i32> [[TMP1]], <i32 -2, i32 -2>
 | 
						|
; CHECK-NEXT:    ret <2 x i1> [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp ne <2 x i32> %x, <i32 40, i32 40>
 | 
						|
  %cmp2 = icmp ne <2 x i32> %x, <i32 39, i32 39>
 | 
						|
  %and = and <2 x i1> %cmp1, %cmp2
 | 
						|
  ret <2 x i1> %and
 | 
						|
}
 | 
						|
 | 
						|
; This is a fuzzer-generated test that would assert because
 | 
						|
; we'd get into foldAndOfICmps() without running InstSimplify
 | 
						|
; on an 'and' that should have been killed. It's not obvious
 | 
						|
; why, but removing anything hides the bug, hence the long test.
 | 
						|
 | 
						|
define void @simplify_before_foldAndOfICmps() {
 | 
						|
; CHECK-LABEL: @simplify_before_foldAndOfICmps(
 | 
						|
; CHECK-NEXT:    [[A8:%.*]] = alloca i16, align 2
 | 
						|
; CHECK-NEXT:    [[L7:%.*]] = load i16, i16* [[A8]], align 2
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i16 [[L7]], -1
 | 
						|
; CHECK-NEXT:    [[B11:%.*]] = zext i1 [[TMP1]] to i16
 | 
						|
; CHECK-NEXT:    [[C10:%.*]] = icmp ugt i16 [[L7]], [[B11]]
 | 
						|
; CHECK-NEXT:    [[C5:%.*]] = icmp slt i16 [[L7]], 1
 | 
						|
; CHECK-NEXT:    [[C7:%.*]] = icmp slt i16 [[L7]], 0
 | 
						|
; CHECK-NEXT:    [[B15:%.*]] = xor i1 [[C7]], [[C10]]
 | 
						|
; CHECK-NEXT:    [[C6:%.*]] = xor i1 [[B15]], true
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[C10]], [[C5]]
 | 
						|
; CHECK-NEXT:    [[C3:%.*]] = and i1 [[TMP2]], [[C6]]
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = xor i1 [[C10]], true
 | 
						|
; CHECK-NEXT:    [[C18:%.*]] = or i1 [[C7]], [[TMP3]]
 | 
						|
; CHECK-NEXT:    [[TMP4:%.*]] = sext i1 [[C3]] to i64
 | 
						|
; CHECK-NEXT:    [[G26:%.*]] = getelementptr i1, i1* null, i64 [[TMP4]]
 | 
						|
; CHECK-NEXT:    store i16 [[L7]], i16* undef, align 2
 | 
						|
; CHECK-NEXT:    store i1 [[C18]], i1* undef, align 1
 | 
						|
; CHECK-NEXT:    store i1* [[G26]], i1** undef, align 8
 | 
						|
; CHECK-NEXT:    ret void
 | 
						|
;
 | 
						|
  %A8 = alloca i16
 | 
						|
  %L7 = load i16, i16* %A8
 | 
						|
  %G21 = getelementptr i16, i16* %A8, i8 -1
 | 
						|
  %B11 = udiv i16 %L7, -1
 | 
						|
  %G4 = getelementptr i16, i16* %A8, i16 %B11
 | 
						|
  %L2 = load i16, i16* %G4
 | 
						|
  %L = load i16, i16* %G4
 | 
						|
  %B23 = mul i16 %B11, %B11
 | 
						|
  %L4 = load i16, i16* %A8
 | 
						|
  %B21 = sdiv i16 %L7, %L4
 | 
						|
  %B7 = sub i16 0, %B21
 | 
						|
  %B18 = mul i16 %B23, %B7
 | 
						|
  %C10 = icmp ugt i16 %L, %B11
 | 
						|
  %B20 = and i16 %L7, %L2
 | 
						|
  %B1 = mul i1 %C10, true
 | 
						|
  %C5 = icmp sle i16 %B21, %L
 | 
						|
  %C11 = icmp ule i16 %B21, %L
 | 
						|
  %C7 = icmp slt i16 %B20, 0
 | 
						|
  %B29 = srem i16 %L4, %B18
 | 
						|
  %B15 = add i1 %C7, %C10
 | 
						|
  %B19 = add i1 %C11, %B15
 | 
						|
  %C6 = icmp sge i1 %C11, %B19
 | 
						|
  %B33 = or i16 %B29, %L4
 | 
						|
  %C13 = icmp uge i1 %C5, %B1
 | 
						|
  %C3 = icmp ult i1 %C13, %C6
 | 
						|
  store i16 undef, i16* %G21
 | 
						|
  %C18 = icmp ule i1 %C10, %C7
 | 
						|
  %G26 = getelementptr i1, i1* null, i1 %C3
 | 
						|
  store i16 %B33, i16* undef
 | 
						|
  store i1 %C18, i1* undef
 | 
						|
  store i1* %G26, i1** undef
 | 
						|
  ret void
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR42691_1(i32 %x) {
 | 
						|
; CHECK-LABEL: @PR42691_1(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = icmp ugt i32 [[X:%.*]], 2147483646
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP1]]
 | 
						|
;
 | 
						|
  %c1 = icmp slt i32 %x, 0
 | 
						|
  %c2 = icmp eq i32 %x, 2147483647
 | 
						|
  %c = or i1 %c1, %c2
 | 
						|
  ret i1 %c
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR42691_1_logical(i32 %x) {
 | 
						|
; CHECK-LABEL: @PR42691_1_logical(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = icmp ugt i32 [[X:%.*]], 2147483646
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP1]]
 | 
						|
;
 | 
						|
  %c1 = icmp slt i32 %x, 0
 | 
						|
  %c2 = icmp eq i32 %x, 2147483647
 | 
						|
  %c = select i1 %c1, i1 true, i1 %c2
 | 
						|
  ret i1 %c
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR42691_2(i32 %x) {
 | 
						|
; CHECK-LABEL: @PR42691_2(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = icmp sgt i32 [[X:%.*]], -2
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP1]]
 | 
						|
;
 | 
						|
  %c1 = icmp ult i32 %x, 2147483648
 | 
						|
  %c2 = icmp eq i32 %x, 4294967295
 | 
						|
  %c = or i1 %c1, %c2
 | 
						|
  ret i1 %c
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR42691_2_logical(i32 %x) {
 | 
						|
; CHECK-LABEL: @PR42691_2_logical(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = icmp sgt i32 [[X:%.*]], -2
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP1]]
 | 
						|
;
 | 
						|
  %c1 = icmp ult i32 %x, 2147483648
 | 
						|
  %c2 = icmp eq i32 %x, 4294967295
 | 
						|
  %c = select i1 %c1, i1 true, i1 %c2
 | 
						|
  ret i1 %c
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR42691_3(i32 %x) {
 | 
						|
; CHECK-LABEL: @PR42691_3(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 [[X:%.*]], -2147483647
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP1]]
 | 
						|
;
 | 
						|
  %c1 = icmp sge i32 %x, 0
 | 
						|
  %c2 = icmp eq i32 %x, -2147483648
 | 
						|
  %c = or i1 %c1, %c2
 | 
						|
  ret i1 %c
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR42691_3_logical(i32 %x) {
 | 
						|
; CHECK-LABEL: @PR42691_3_logical(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i32 [[X:%.*]], -2147483647
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP1]]
 | 
						|
;
 | 
						|
  %c1 = icmp sge i32 %x, 0
 | 
						|
  %c2 = icmp eq i32 %x, -2147483648
 | 
						|
  %c = select i1 %c1, i1 true, i1 %c2
 | 
						|
  ret i1 %c
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR42691_4(i32 %x) {
 | 
						|
; CHECK-LABEL: @PR42691_4(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i32 [[X:%.*]], 1
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP1]]
 | 
						|
;
 | 
						|
  %c1 = icmp uge i32 %x, 2147483648
 | 
						|
  %c2 = icmp eq i32 %x, 0
 | 
						|
  %c = or i1 %c1, %c2
 | 
						|
  ret i1 %c
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR42691_4_logical(i32 %x) {
 | 
						|
; CHECK-LABEL: @PR42691_4_logical(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i32 [[X:%.*]], 1
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP1]]
 | 
						|
;
 | 
						|
  %c1 = icmp uge i32 %x, 2147483648
 | 
						|
  %c2 = icmp eq i32 %x, 0
 | 
						|
  %c = select i1 %c1, i1 true, i1 %c2
 | 
						|
  ret i1 %c
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR42691_5(i32 %x) {
 | 
						|
; CHECK-LABEL: @PR42691_5(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X:%.*]], -2147483647
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -2147483646
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %c1 = icmp slt i32 %x, 1
 | 
						|
  %c2 = icmp eq i32 %x, 2147483647
 | 
						|
  %c = or i1 %c1, %c2
 | 
						|
  ret i1 %c
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR42691_5_logical(i32 %x) {
 | 
						|
; CHECK-LABEL: @PR42691_5_logical(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X:%.*]], -2147483647
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -2147483646
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %c1 = icmp slt i32 %x, 1
 | 
						|
  %c2 = icmp eq i32 %x, 2147483647
 | 
						|
  %c = select i1 %c1, i1 true, i1 %c2
 | 
						|
  ret i1 %c
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR42691_6(i32 %x) {
 | 
						|
; CHECK-LABEL: @PR42691_6(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X:%.*]], 1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -2147483646
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %c1 = icmp ult i32 %x, 2147483649
 | 
						|
  %c2 = icmp eq i32 %x, 4294967295
 | 
						|
  %c = or i1 %c1, %c2
 | 
						|
  ret i1 %c
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR42691_6_logical(i32 %x) {
 | 
						|
; CHECK-LABEL: @PR42691_6_logical(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X:%.*]], 1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -2147483646
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %c1 = icmp ult i32 %x, 2147483649
 | 
						|
  %c2 = icmp eq i32 %x, 4294967295
 | 
						|
  %c = select i1 %c1, i1 true, i1 %c2
 | 
						|
  ret i1 %c
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR42691_7(i32 %x) {
 | 
						|
; CHECK-LABEL: @PR42691_7(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X:%.*]], -1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp slt i32 [[TMP1]], 0
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %c1 = icmp uge i32 %x, 2147483649
 | 
						|
  %c2 = icmp eq i32 %x, 0
 | 
						|
  %c = or i1 %c1, %c2
 | 
						|
  ret i1 %c
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR42691_7_logical(i32 %x) {
 | 
						|
; CHECK-LABEL: @PR42691_7_logical(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X:%.*]], -1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp slt i32 [[TMP1]], 0
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %c1 = icmp uge i32 %x, 2147483649
 | 
						|
  %c2 = icmp eq i32 %x, 0
 | 
						|
  %c = select i1 %c1, i1 true, i1 %c2
 | 
						|
  ret i1 %c
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR42691_8(i32 %x) {
 | 
						|
; CHECK-LABEL: @PR42691_8(
 | 
						|
; 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
 | 
						|
  %c = and i1 %c1, %c2
 | 
						|
  ret i1 %c
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR42691_8_logical(i32 %x) {
 | 
						|
; CHECK-LABEL: @PR42691_8_logical(
 | 
						|
; 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
 | 
						|
  %c = select i1 %c1, i1 %c2, i1 false
 | 
						|
  ret i1 %c
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR42691_9(i32 %x) {
 | 
						|
; CHECK-LABEL: @PR42691_9(
 | 
						|
; 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
 | 
						|
  %c = and i1 %c1, %c2
 | 
						|
  ret i1 %c
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR42691_9_logical(i32 %x) {
 | 
						|
; CHECK-LABEL: @PR42691_9_logical(
 | 
						|
; 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
 | 
						|
  %c = select i1 %c1, i1 %c2, i1 false
 | 
						|
  ret i1 %c
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR42691_10(i32 %x) {
 | 
						|
; CHECK-LABEL: @PR42691_10(
 | 
						|
; 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
 | 
						|
  %c = and i1 %c1, %c2
 | 
						|
  ret i1 %c
 | 
						|
}
 | 
						|
 | 
						|
define i1 @PR42691_10_logical(i32 %x) {
 | 
						|
; CHECK-LABEL: @PR42691_10_logical(
 | 
						|
; 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
 | 
						|
  %c = select i1 %c1, i1 %c2, i1 false
 | 
						|
  ret i1 %c
 | 
						|
}
 | 
						|
 | 
						|
define i1 @substitute_constant_and_eq_eq(i8 %x, i8 %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_and_eq_eq(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[X:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[C1]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %x, 42
 | 
						|
  %c2 = icmp eq i8 %x, %y
 | 
						|
  %r = and i1 %c1, %c2
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
define i1 @substitute_constant_and_eq_eq_logical(i8 %x, i8 %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_and_eq_eq_logical(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[X:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[R:%.*]] = select i1 [[C1]], i1 [[C2]], i1 false
 | 
						|
; CHECK-NEXT:    ret i1 [[R]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %x, 42
 | 
						|
  %c2 = icmp eq i8 %x, %y
 | 
						|
  %r = select i1 %c1, i1 %c2, i1 false
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
define i1 @substitute_constant_and_eq_eq_commute(i8 %x, i8 %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_and_eq_eq_commute(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[X:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[C1]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %x, 42
 | 
						|
  %c2 = icmp eq i8 %x, %y
 | 
						|
  %r = and i1 %c2, %c1
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
define i1 @substitute_constant_and_eq_eq_commute_logical(i8 %x, i8 %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_and_eq_eq_commute_logical(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[X:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[C1]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %x, 42
 | 
						|
  %c2 = icmp eq i8 %x, %y
 | 
						|
  %r = select i1 %c2, i1 %c1, i1 false
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
define i1 @substitute_constant_and_eq_ugt_swap(i8 %x, i8 %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_and_eq_ugt_swap(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[X:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = icmp ugt i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[C1]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %x, 42
 | 
						|
  %c2 = icmp ugt i8 %y, %x
 | 
						|
  %r = and i1 %c2, %c1
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
define i1 @substitute_constant_and_eq_ugt_swap_logical(i8 %x, i8 %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_and_eq_ugt_swap_logical(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[X:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = icmp ugt i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[C1]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %x, 42
 | 
						|
  %c2 = icmp ugt i8 %y, %x
 | 
						|
  %r = select i1 %c2, i1 %c1, i1 false
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
define <2 x i1> @substitute_constant_and_eq_ne_vec(<2 x i8> %x, <2 x i8> %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_and_eq_ne_vec(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq <2 x i8> [[X:%.*]], <i8 42, i8 97>
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = icmp ne <2 x i8> [[Y:%.*]], <i8 42, i8 97>
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and <2 x i1> [[C1]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    ret <2 x i1> [[TMP2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq <2 x i8> %x, <i8 42, i8 97>
 | 
						|
  %c2 = icmp ne <2 x i8> %x, %y
 | 
						|
  %r = and <2 x i1> %c1, %c2
 | 
						|
  ret <2 x i1> %r
 | 
						|
}
 | 
						|
 | 
						|
define i1 @substitute_constant_and_eq_sgt_use(i8 %x, i8 %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_and_eq_sgt_use(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[X:%.*]], 42
 | 
						|
; CHECK-NEXT:    call void @use(i1 [[C1]])
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[C1]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %x, 42
 | 
						|
  call void @use(i1 %c1)
 | 
						|
  %c2 = icmp sgt i8 %x, %y
 | 
						|
  %r = and i1 %c2, %c1
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
define i1 @substitute_constant_and_eq_sgt_use_logical(i8 %x, i8 %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_and_eq_sgt_use_logical(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[X:%.*]], 42
 | 
						|
; CHECK-NEXT:    call void @use(i1 [[C1]])
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i1 [[C1]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %x, 42
 | 
						|
  call void @use(i1 %c1)
 | 
						|
  %c2 = icmp sgt i8 %x, %y
 | 
						|
  %r = select i1 %c2, i1 %c1, i1 false
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
; Negative test - extra use
 | 
						|
 | 
						|
define i1 @substitute_constant_and_eq_sgt_use2(i8 %x, i8 %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_and_eq_sgt_use2(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[X:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp sgt i8 [[X]], [[Y:%.*]]
 | 
						|
; CHECK-NEXT:    call void @use(i1 [[C2]])
 | 
						|
; CHECK-NEXT:    [[R:%.*]] = and i1 [[C2]], [[C1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[R]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %x, 42
 | 
						|
  %c2 = icmp sgt i8 %x, %y
 | 
						|
  call void @use(i1 %c2)
 | 
						|
  %r = and i1 %c2, %c1
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
define i1 @substitute_constant_and_eq_sgt_use2_logical(i8 %x, i8 %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_and_eq_sgt_use2_logical(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[X:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp sgt i8 [[X]], [[Y:%.*]]
 | 
						|
; CHECK-NEXT:    call void @use(i1 [[C2]])
 | 
						|
; CHECK-NEXT:    [[R:%.*]] = and i1 [[C2]], [[C1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[R]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %x, 42
 | 
						|
  %c2 = icmp sgt i8 %x, %y
 | 
						|
  call void @use(i1 %c2)
 | 
						|
  %r = select i1 %c2, i1 %c1, i1 false
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
; Extra use does not prevent transform if the expression simplifies:
 | 
						|
; X == MAX && X < Y --> false
 | 
						|
 | 
						|
define i1 @slt_and_max(i8 %x, i8 %y)  {
 | 
						|
; CHECK-LABEL: @slt_and_max(
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]]
 | 
						|
; CHECK-NEXT:    call void @use(i1 [[C2]])
 | 
						|
; CHECK-NEXT:    ret i1 false
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %x, 127
 | 
						|
  %c2 = icmp slt i8 %x, %y
 | 
						|
  call void @use(i1 %c2)
 | 
						|
  %r = and i1 %c2, %c1
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
define i1 @slt_and_max_logical(i8 %x, i8 %y)  {
 | 
						|
; CHECK-LABEL: @slt_and_max_logical(
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]]
 | 
						|
; CHECK-NEXT:    call void @use(i1 [[C2]])
 | 
						|
; CHECK-NEXT:    ret i1 false
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %x, 127
 | 
						|
  %c2 = icmp slt i8 %x, %y
 | 
						|
  call void @use(i1 %c2)
 | 
						|
  %r = select i1 %c2, i1 %c1, i1 false
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
; Extra use does not prevent transform if the expression simplifies:
 | 
						|
; X == MAX && X >= Y --> X == MAX
 | 
						|
 | 
						|
define i1 @sge_and_max(i8 %x, i8 %y)  {
 | 
						|
; CHECK-LABEL: @sge_and_max(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[X:%.*]], 127
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp sge i8 [[X]], [[Y:%.*]]
 | 
						|
; CHECK-NEXT:    call void @use(i1 [[C2]])
 | 
						|
; CHECK-NEXT:    ret i1 [[C1]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %x, 127
 | 
						|
  %c2 = icmp sge i8 %x, %y
 | 
						|
  call void @use(i1 %c2)
 | 
						|
  %r = and i1 %c2, %c1
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
define i1 @sge_and_max_logical(i8 %x, i8 %y)  {
 | 
						|
; CHECK-LABEL: @sge_and_max_logical(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[X:%.*]], 127
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp sge i8 [[X]], [[Y:%.*]]
 | 
						|
; CHECK-NEXT:    call void @use(i1 [[C2]])
 | 
						|
; CHECK-NEXT:    ret i1 [[C1]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %x, 127
 | 
						|
  %c2 = icmp sge i8 %x, %y
 | 
						|
  call void @use(i1 %c2)
 | 
						|
  %r = select i1 %c2, i1 %c1, i1 false
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
define i1 @substitute_constant_and_ne_ugt_swap(i8 %x, i8 %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_and_ne_ugt_swap(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp ne i8 [[X:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp ugt i8 [[Y:%.*]], [[X]]
 | 
						|
; CHECK-NEXT:    [[R:%.*]] = and i1 [[C2]], [[C1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[R]]
 | 
						|
;
 | 
						|
  %c1 = icmp ne i8 %x, 42
 | 
						|
  %c2 = icmp ugt i8 %y, %x
 | 
						|
  %r = and i1 %c2, %c1
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
define i1 @substitute_constant_and_ne_ugt_swap_logical(i8 %x, i8 %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_and_ne_ugt_swap_logical(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp ne i8 [[X:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp ugt i8 [[Y:%.*]], [[X]]
 | 
						|
; CHECK-NEXT:    [[R:%.*]] = and i1 [[C2]], [[C1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[R]]
 | 
						|
;
 | 
						|
  %c1 = icmp ne i8 %x, 42
 | 
						|
  %c2 = icmp ugt i8 %y, %x
 | 
						|
  %r = select i1 %c2, i1 %c1, i1 false
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
define i1 @substitute_constant_or_ne_swap_sle(i8 %x, i8 %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_or_ne_swap_sle(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp ne i8 [[X:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i8 [[Y:%.*]], 43
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = or i1 [[C1]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %c1 = icmp ne i8 %x, 42
 | 
						|
  %c2 = icmp sle i8 %y, %x
 | 
						|
  %r = or i1 %c1, %c2
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
define i1 @substitute_constant_or_ne_swap_sle_logical(i8 %x, i8 %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_or_ne_swap_sle_logical(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp ne i8 [[X:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp slt i8 [[Y:%.*]], 43
 | 
						|
; CHECK-NEXT:    [[R:%.*]] = select i1 [[C1]], i1 true, i1 [[C2]]
 | 
						|
; CHECK-NEXT:    ret i1 [[R]]
 | 
						|
;
 | 
						|
  %c1 = icmp ne i8 %x, 42
 | 
						|
  %c2 = icmp sle i8 %y, %x
 | 
						|
  %r = select i1 %c1, i1 true, i1 %c2
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
define i1 @substitute_constant_or_ne_uge_commute(i8 %x, i8 %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_or_ne_uge_commute(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp ne i8 [[X:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i8 [[Y:%.*]], 43
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = or i1 [[C1]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %c1 = icmp ne i8 %x, 42
 | 
						|
  %c2 = icmp uge i8 %x, %y
 | 
						|
  %r = or i1 %c2, %c1
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
define i1 @substitute_constant_or_ne_uge_commute_logical(i8 %x, i8 %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_or_ne_uge_commute_logical(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp ne i8 [[X:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = icmp ult i8 [[Y:%.*]], 43
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = or i1 [[C1]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %c1 = icmp ne i8 %x, 42
 | 
						|
  %c2 = icmp uge i8 %x, %y
 | 
						|
  %r = select i1 %c2, i1 true, i1 %c1
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
; Negative test - not safe to substitute vector constant with undef element
 | 
						|
 | 
						|
define <2 x i1> @substitute_constant_or_ne_slt_swap_vec(<2 x i8> %x, <2 x i8> %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_or_ne_slt_swap_vec(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp ne <2 x i8> [[X:%.*]], <i8 42, i8 undef>
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp slt <2 x i8> [[Y:%.*]], [[X]]
 | 
						|
; CHECK-NEXT:    [[R:%.*]] = or <2 x i1> [[C1]], [[C2]]
 | 
						|
; CHECK-NEXT:    ret <2 x i1> [[R]]
 | 
						|
;
 | 
						|
  %c1 = icmp ne <2 x i8> %x, <i8 42, i8 undef>
 | 
						|
  %c2 = icmp slt <2 x i8> %y, %x
 | 
						|
  %r = or <2 x i1> %c1, %c2
 | 
						|
  ret <2 x i1> %r
 | 
						|
}
 | 
						|
 | 
						|
define i1 @substitute_constant_or_eq_swap_ne(i8 %x, i8 %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_or_eq_swap_ne(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[X:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp ne i8 [[Y:%.*]], [[X]]
 | 
						|
; CHECK-NEXT:    [[R:%.*]] = or i1 [[C1]], [[C2]]
 | 
						|
; CHECK-NEXT:    ret i1 [[R]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %x, 42
 | 
						|
  %c2 = icmp ne i8 %y, %x
 | 
						|
  %r = or i1 %c1, %c2
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
define i1 @substitute_constant_or_eq_swap_ne_logical(i8 %x, i8 %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_or_eq_swap_ne_logical(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[X:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp ne i8 [[Y:%.*]], [[X]]
 | 
						|
; CHECK-NEXT:    [[R:%.*]] = select i1 [[C1]], i1 true, i1 [[C2]]
 | 
						|
; CHECK-NEXT:    ret i1 [[R]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %x, 42
 | 
						|
  %c2 = icmp ne i8 %y, %x
 | 
						|
  %r = select i1 %c1, i1 true, i1 %c2
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
define i1 @substitute_constant_or_ne_sge_use(i8 %x, i8 %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_or_ne_sge_use(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp ne i8 [[X:%.*]], 42
 | 
						|
; CHECK-NEXT:    call void @use(i1 [[C1]])
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i8 [[Y:%.*]], 43
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = or i1 [[C1]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %c1 = icmp ne i8 %x, 42
 | 
						|
  call void @use(i1 %c1)
 | 
						|
  %c2 = icmp sge i8 %x, %y
 | 
						|
  %r = or i1 %c2, %c1
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
define i1 @substitute_constant_or_ne_sge_use_logical(i8 %x, i8 %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_or_ne_sge_use_logical(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp ne i8 [[X:%.*]], 42
 | 
						|
; CHECK-NEXT:    call void @use(i1 [[C1]])
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i8 [[Y:%.*]], 43
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = or i1 [[C1]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %c1 = icmp ne i8 %x, 42
 | 
						|
  call void @use(i1 %c1)
 | 
						|
  %c2 = icmp sge i8 %x, %y
 | 
						|
  %r = select i1 %c2, i1 true, i1 %c1
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
; Negative test - extra use
 | 
						|
 | 
						|
define i1 @substitute_constant_or_ne_ule_use2(i8 %x, i8 %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_or_ne_ule_use2(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp ne i8 [[X:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp ule i8 [[X]], [[Y:%.*]]
 | 
						|
; CHECK-NEXT:    call void @use(i1 [[C2]])
 | 
						|
; CHECK-NEXT:    [[R:%.*]] = or i1 [[C2]], [[C1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[R]]
 | 
						|
;
 | 
						|
  %c1 = icmp ne i8 %x, 42
 | 
						|
  %c2 = icmp ule i8 %x, %y
 | 
						|
  call void @use(i1 %c2)
 | 
						|
  %r = or i1 %c2, %c1
 | 
						|
  ret i1 %r
 | 
						|
}
 | 
						|
 | 
						|
define i1 @substitute_constant_or_ne_ule_use2_logical(i8 %x, i8 %y) {
 | 
						|
; CHECK-LABEL: @substitute_constant_or_ne_ule_use2_logical(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp ne i8 [[X:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp ule i8 [[X]], [[Y:%.*]]
 | 
						|
; CHECK-NEXT:    call void @use(i1 [[C2]])
 | 
						|
; CHECK-NEXT:    [[R:%.*]] = or i1 [[C2]], [[C1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[R]]
 | 
						|
;
 | 
						|
  %c1 = icmp ne i8 %x, 42
 | 
						|
  %c2 = icmp ule i8 %x, %y
 | 
						|
  call void @use(i1 %c2)
 | 
						|
  %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]], 16
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %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]], 16
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %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:%.*]], -4
 | 
						|
; 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, 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:%.*]], -7
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i8 [[TMP1]], 4
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %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:%.*]] = icmp eq i8 [[X:%.*]], 10
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP1]]
 | 
						|
;
 | 
						|
  %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:    ret i1 false
 | 
						|
;
 | 
						|
  %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
 | 
						|
}
 | 
						|
 | 
						|
define i1 @and_ranges_signed_pred(i64 %x) {
 | 
						|
; CHECK-LABEL: @and_ranges_signed_pred(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = add i64 [[X:%.*]], -9223372036854775681
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i64 [[TMP1]], -9223372036854775553
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %t1 = add i64 %x, 127
 | 
						|
  %t2 = icmp slt i64 %t1, 1024
 | 
						|
  %t3 = add i64 %x, 128
 | 
						|
  %t4 = icmp slt i64 %t3, 256
 | 
						|
  %t5 = and i1 %t2, %t4
 | 
						|
  ret i1 %t5
 | 
						|
}
 | 
						|
 | 
						|
define i1 @and_two_ranges_to_mask_and_range(i8 %c)  {
 | 
						|
; CHECK-LABEL: @and_two_ranges_to_mask_and_range(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = and i8 [[C:%.*]], -33
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = add i8 [[TMP1]], -91
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = icmp ult i8 [[TMP2]], -26
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP3]]
 | 
						|
;
 | 
						|
  %c.off = add i8 %c, -97
 | 
						|
  %cmp1 = icmp ugt i8 %c.off, 25
 | 
						|
  %c.off2 = add i8 %c, -65
 | 
						|
  %cmp2 = icmp ugt i8 %c.off2, 25
 | 
						|
  %and = and i1 %cmp1, %cmp2
 | 
						|
  ret i1 %and
 | 
						|
}
 | 
						|
 | 
						|
define i1 @and_two_ranges_to_mask_and_range_not_pow2_diff(i8 %c)  {
 | 
						|
; CHECK-LABEL: @and_two_ranges_to_mask_and_range_not_pow2_diff(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = add i8 [[C:%.*]], -123
 | 
						|
; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i8 [[TMP1]], -26
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = add i8 [[C]], -90
 | 
						|
; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i8 [[TMP2]], -26
 | 
						|
; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
 | 
						|
; CHECK-NEXT:    ret i1 [[AND]]
 | 
						|
;
 | 
						|
  %c.off = add i8 %c, -97
 | 
						|
  %cmp1 = icmp ugt i8 %c.off, 25
 | 
						|
  %c.off2 = add i8 %c, -64
 | 
						|
  %cmp2 = icmp ugt i8 %c.off2, 25
 | 
						|
  %and = and i1 %cmp1, %cmp2
 | 
						|
  ret i1 %and
 | 
						|
}
 | 
						|
 | 
						|
define i1 @and_two_ranges_to_mask_and_range_different_sizes(i8 %c)  {
 | 
						|
; CHECK-LABEL: @and_two_ranges_to_mask_and_range_different_sizes(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = add i8 [[C:%.*]], -123
 | 
						|
; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i8 [[TMP1]], -26
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = add i8 [[C]], -90
 | 
						|
; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i8 [[TMP2]], -25
 | 
						|
; CHECK-NEXT:    [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]]
 | 
						|
; CHECK-NEXT:    ret i1 [[AND]]
 | 
						|
;
 | 
						|
  %c.off = add i8 %c, -97
 | 
						|
  %cmp1 = icmp ugt i8 %c.off, 25
 | 
						|
  %c.off2 = add i8 %c, -65
 | 
						|
  %cmp2 = icmp ugt i8 %c.off2, 24
 | 
						|
  %and = and i1 %cmp1, %cmp2
 | 
						|
  ret i1 %and
 | 
						|
}
 | 
						|
 | 
						|
define i1 @and_two_ranges_to_mask_and_range_no_add_on_one_range(i16 %x) {
 | 
						|
; CHECK-LABEL: @and_two_ranges_to_mask_and_range_no_add_on_one_range(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = and i16 [[X:%.*]], -20
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp ugt i16 [[TMP1]], 11
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP2]]
 | 
						|
;
 | 
						|
  %cmp1 = icmp uge i16 %x, 12
 | 
						|
  %cmp2 = icmp ult i16 %x, 16
 | 
						|
  %cmp3 = icmp uge i16 %x, 28
 | 
						|
  %or = or i1 %cmp2, %cmp3
 | 
						|
  %and = and i1 %cmp1, %or
 | 
						|
  ret i1 %and
 | 
						|
}
 | 
						|
 | 
						|
; This tests an "is_alpha" style check for the combination of logical or
 | 
						|
; and nowrap flags on the adds. In this case, the logical or will not be
 | 
						|
; converted into a bitwise or.
 | 
						|
define i1 @is_ascii_alphabetic(i32 %char) {
 | 
						|
; CHECK-LABEL: @is_ascii_alphabetic(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[CHAR:%.*]], -33
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = add i32 [[TMP1]], -65
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = icmp ult i32 [[TMP2]], 26
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP3]]
 | 
						|
;
 | 
						|
  %add1 = add nsw i32 %char, -65
 | 
						|
  %cmp1 = icmp ult i32 %add1, 26
 | 
						|
  %add2 = add nsw i32 %char, -97
 | 
						|
  %cmp2 = icmp ult i32 %add2, 26
 | 
						|
  %logical = select i1 %cmp1, i1 true, i1 %cmp2
 | 
						|
  ret i1 %logical
 | 
						|
}
 | 
						|
 | 
						|
define i1 @is_ascii_alphabetic_inverted(i32 %char) {
 | 
						|
; CHECK-LABEL: @is_ascii_alphabetic_inverted(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[CHAR:%.*]], -33
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = add i32 [[TMP1]], -91
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = icmp ult i32 [[TMP2]], -26
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP3]]
 | 
						|
;
 | 
						|
  %add1 = add nsw i32 %char, -91
 | 
						|
  %cmp1 = icmp ult i32 %add1, -26
 | 
						|
  %add2 = add nsw i32 %char, -123
 | 
						|
  %cmp2 = icmp ult i32 %add2, -26
 | 
						|
  %logical = select i1 %cmp1, i1 %cmp2, i1 false
 | 
						|
  ret i1 %logical
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_and_bitwise_and_icmps(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @bitwise_and_bitwise_and_icmps(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i8 [[TMP2]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    [[TMP4:%.*]] = and i1 [[C1]], [[TMP3]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP4]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp ne i8 %x.m1, 0
 | 
						|
  %c3 = icmp ne i8 %x.m2, 0
 | 
						|
  %and1 = and i1 %c1, %c2
 | 
						|
  %and2 = and i1 %and1, %c3
 | 
						|
  ret i1 %and2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_and_bitwise_and_icmps_comm1(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @bitwise_and_bitwise_and_icmps_comm1(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i8 [[TMP2]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    [[TMP4:%.*]] = and i1 [[C1]], [[TMP3]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP4]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp ne i8 %x.m1, 0
 | 
						|
  %c3 = icmp ne i8 %x.m2, 0
 | 
						|
  %and1 = and i1 %c1, %c2
 | 
						|
  %and2 = and i1 %c3, %and1
 | 
						|
  ret i1 %and2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_and_bitwise_and_icmps_comm2(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @bitwise_and_bitwise_and_icmps_comm2(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i8 [[TMP2]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    [[TMP4:%.*]] = and i1 [[TMP3]], [[C1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP4]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp ne i8 %x.m1, 0
 | 
						|
  %c3 = icmp ne i8 %x.m2, 0
 | 
						|
  %and1 = and i1 %c2, %c1
 | 
						|
  %and2 = and i1 %and1, %c3
 | 
						|
  ret i1 %and2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_and_bitwise_and_icmps_comm3(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @bitwise_and_bitwise_and_icmps_comm3(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i8 [[TMP2]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    [[TMP4:%.*]] = and i1 [[TMP3]], [[C1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP4]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp ne i8 %x.m1, 0
 | 
						|
  %c3 = icmp ne i8 %x.m2, 0
 | 
						|
  %and1 = and i1 %c2, %c1
 | 
						|
  %and2 = and i1 %c3, %and1
 | 
						|
  ret i1 %and2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_and_logical_and_icmps(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @bitwise_and_logical_and_icmps(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i8 [[TMP2]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    [[TMP4:%.*]] = select i1 [[C1]], i1 [[TMP3]], i1 false
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP4]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp ne i8 %x.m1, 0
 | 
						|
  %c3 = icmp ne i8 %x.m2, 0
 | 
						|
  %and1 = select i1 %c1, i1 %c2, i1 false
 | 
						|
  %and2 = and i1 %and1, %c3
 | 
						|
  ret i1 %and2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_and_logical_and_icmps_comm1(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @bitwise_and_logical_and_icmps_comm1(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i8 [[TMP2]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    [[TMP4:%.*]] = select i1 [[C1]], i1 [[TMP3]], i1 false
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP4]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp ne i8 %x.m1, 0
 | 
						|
  %c3 = icmp ne i8 %x.m2, 0
 | 
						|
  %and1 = select i1 %c1, i1 %c2, i1 false
 | 
						|
  %and2 = and i1 %c3, %and1
 | 
						|
  ret i1 %and2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_and_logical_and_icmps_comm2(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @bitwise_and_logical_and_icmps_comm2(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = freeze i8 [[Z_SHIFT]]
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = or i8 [[TMP1]], 1
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = and i8 [[TMP2]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP4:%.*]] = icmp eq i8 [[TMP3]], [[TMP2]]
 | 
						|
; CHECK-NEXT:    [[TMP5:%.*]] = select i1 [[TMP4]], i1 [[C1]], i1 false
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP5]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp ne i8 %x.m1, 0
 | 
						|
  %c3 = icmp ne i8 %x.m2, 0
 | 
						|
  %and1 = select i1 %c2, i1 %c1, i1 false
 | 
						|
  %and2 = and i1 %and1, %c3
 | 
						|
  ret i1 %and2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_and_logical_and_icmps_comm3(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @bitwise_and_logical_and_icmps_comm3(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i8 [[TMP2]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    [[TMP4:%.*]] = select i1 [[TMP3]], i1 [[C1]], i1 false
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP4]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp ne i8 %x.m1, 0
 | 
						|
  %c3 = icmp ne i8 %x.m2, 0
 | 
						|
  %and1 = select i1 %c2, i1 %c1, i1 false
 | 
						|
  %and2 = and i1 %c3, %and1
 | 
						|
  ret i1 %and2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @logical_and_bitwise_and_icmps(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @logical_and_bitwise_and_icmps(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[X_M1:%.*]] = and i8 [[X:%.*]], 1
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]]
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp ne i8 [[X_M1]], 0
 | 
						|
; CHECK-NEXT:    [[C3:%.*]] = icmp ne i8 [[X_M2]], 0
 | 
						|
; CHECK-NEXT:    [[AND1:%.*]] = and i1 [[C1]], [[C2]]
 | 
						|
; CHECK-NEXT:    [[AND2:%.*]] = select i1 [[AND1]], i1 [[C3]], i1 false
 | 
						|
; CHECK-NEXT:    ret i1 [[AND2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp ne i8 %x.m1, 0
 | 
						|
  %c3 = icmp ne i8 %x.m2, 0
 | 
						|
  %and1 = and i1 %c1, %c2
 | 
						|
  %and2 = select i1 %and1, i1 %c3, i1 false
 | 
						|
  ret i1 %and2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @logical_and_bitwise_and_icmps_comm1(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @logical_and_bitwise_and_icmps_comm1(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[X_M1:%.*]] = and i8 [[X:%.*]], 1
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]]
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp ne i8 [[X_M1]], 0
 | 
						|
; CHECK-NEXT:    [[C3:%.*]] = icmp ne i8 [[X_M2]], 0
 | 
						|
; CHECK-NEXT:    [[AND1:%.*]] = and i1 [[C1]], [[C2]]
 | 
						|
; CHECK-NEXT:    [[AND2:%.*]] = select i1 [[C3]], i1 [[AND1]], i1 false
 | 
						|
; CHECK-NEXT:    ret i1 [[AND2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp ne i8 %x.m1, 0
 | 
						|
  %c3 = icmp ne i8 %x.m2, 0
 | 
						|
  %and1 = and i1 %c1, %c2
 | 
						|
  %and2 = select i1 %c3, i1 %and1, i1 false
 | 
						|
  ret i1 %and2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @logical_and_bitwise_and_icmps_comm2(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @logical_and_bitwise_and_icmps_comm2(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[X_M1:%.*]] = and i8 [[X:%.*]], 1
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]]
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp ne i8 [[X_M1]], 0
 | 
						|
; CHECK-NEXT:    [[C3:%.*]] = icmp ne i8 [[X_M2]], 0
 | 
						|
; CHECK-NEXT:    [[AND1:%.*]] = and i1 [[C2]], [[C1]]
 | 
						|
; CHECK-NEXT:    [[AND2:%.*]] = select i1 [[AND1]], i1 [[C3]], i1 false
 | 
						|
; CHECK-NEXT:    ret i1 [[AND2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp ne i8 %x.m1, 0
 | 
						|
  %c3 = icmp ne i8 %x.m2, 0
 | 
						|
  %and1 = and i1 %c2, %c1
 | 
						|
  %and2 = select i1 %and1, i1 %c3, i1 false
 | 
						|
  ret i1 %and2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @logical_and_bitwise_and_icmps_comm3(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @logical_and_bitwise_and_icmps_comm3(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[X_M1:%.*]] = and i8 [[X:%.*]], 1
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]]
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp ne i8 [[X_M1]], 0
 | 
						|
; CHECK-NEXT:    [[C3:%.*]] = icmp ne i8 [[X_M2]], 0
 | 
						|
; CHECK-NEXT:    [[AND1:%.*]] = and i1 [[C2]], [[C1]]
 | 
						|
; CHECK-NEXT:    [[AND2:%.*]] = select i1 [[C3]], i1 [[AND1]], i1 false
 | 
						|
; CHECK-NEXT:    ret i1 [[AND2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp ne i8 %x.m1, 0
 | 
						|
  %c3 = icmp ne i8 %x.m2, 0
 | 
						|
  %and1 = and i1 %c2, %c1
 | 
						|
  %and2 = select i1 %c3, i1 %and1, i1 false
 | 
						|
  ret i1 %and2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @logical_and_logical_and_icmps(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @logical_and_logical_and_icmps(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[X_M1:%.*]] = and i8 [[X:%.*]], 1
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]]
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp ne i8 [[X_M1]], 0
 | 
						|
; CHECK-NEXT:    [[C3:%.*]] = icmp ne i8 [[X_M2]], 0
 | 
						|
; CHECK-NEXT:    [[AND1:%.*]] = select i1 [[C1]], i1 [[C2]], i1 false
 | 
						|
; CHECK-NEXT:    [[AND2:%.*]] = select i1 [[AND1]], i1 [[C3]], i1 false
 | 
						|
; CHECK-NEXT:    ret i1 [[AND2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp ne i8 %x.m1, 0
 | 
						|
  %c3 = icmp ne i8 %x.m2, 0
 | 
						|
  %and1 = select i1 %c1, i1 %c2, i1 false
 | 
						|
  %and2 = select i1 %and1, i1 %c3, i1 false
 | 
						|
  ret i1 %and2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @logical_and_logical_and_icmps_comm1(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @logical_and_logical_and_icmps_comm1(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[X_M1:%.*]] = and i8 [[X:%.*]], 1
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]]
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp ne i8 [[X_M1]], 0
 | 
						|
; CHECK-NEXT:    [[C3:%.*]] = icmp ne i8 [[X_M2]], 0
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[C3]], i1 [[C1]], i1 false
 | 
						|
; CHECK-NEXT:    [[AND2:%.*]] = select i1 [[TMP1]], i1 [[C2]], i1 false
 | 
						|
; CHECK-NEXT:    ret i1 [[AND2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp ne i8 %x.m1, 0
 | 
						|
  %c3 = icmp ne i8 %x.m2, 0
 | 
						|
  %and1 = select i1 %c1, i1 %c2, i1 false
 | 
						|
  %and2 = select i1 %c3, i1 %and1, i1 false
 | 
						|
  ret i1 %and2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @logical_and_logical_and_icmps_comm2(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @logical_and_logical_and_icmps_comm2(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[X_M1:%.*]] = and i8 [[X:%.*]], 1
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]]
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp ne i8 [[X_M1]], 0
 | 
						|
; CHECK-NEXT:    [[C3:%.*]] = icmp ne i8 [[X_M2]], 0
 | 
						|
; CHECK-NEXT:    [[AND1:%.*]] = select i1 [[C2]], i1 [[C1]], i1 false
 | 
						|
; CHECK-NEXT:    [[AND2:%.*]] = select i1 [[AND1]], i1 [[C3]], i1 false
 | 
						|
; CHECK-NEXT:    ret i1 [[AND2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp ne i8 %x.m1, 0
 | 
						|
  %c3 = icmp ne i8 %x.m2, 0
 | 
						|
  %and1 = select i1 %c2, i1 %c1, i1 false
 | 
						|
  %and2 = select i1 %and1, i1 %c3, i1 false
 | 
						|
  ret i1 %and2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @logical_and_logical_and_icmps_comm3(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @logical_and_logical_and_icmps_comm3(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i8 [[TMP2]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    [[AND2:%.*]] = select i1 [[TMP3]], i1 [[C1]], i1 false
 | 
						|
; CHECK-NEXT:    ret i1 [[AND2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp ne i8 %x.m1, 0
 | 
						|
  %c3 = icmp ne i8 %x.m2, 0
 | 
						|
  %and1 = select i1 %c2, i1 %c1, i1 false
 | 
						|
  %and2 = select i1 %c3, i1 %and1, i1 false
 | 
						|
  ret i1 %and2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_or_bitwise_or_icmps(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @bitwise_or_bitwise_or_icmps(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = icmp ne i8 [[TMP2]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    [[TMP4:%.*]] = or i1 [[C1]], [[TMP3]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP4]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp eq i8 %x.m1, 0
 | 
						|
  %c3 = icmp eq i8 %x.m2, 0
 | 
						|
  %or1 = or i1 %c1, %c2
 | 
						|
  %or2 = or i1 %or1, %c3
 | 
						|
  ret i1 %or2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_or_bitwise_or_icmps_comm1(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @bitwise_or_bitwise_or_icmps_comm1(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = icmp ne i8 [[TMP2]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    [[TMP4:%.*]] = or i1 [[C1]], [[TMP3]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP4]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp eq i8 %x.m1, 0
 | 
						|
  %c3 = icmp eq i8 %x.m2, 0
 | 
						|
  %or1 = or i1 %c1, %c2
 | 
						|
  %or2 = or i1 %c3, %or1
 | 
						|
  ret i1 %or2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_or_bitwise_or_icmps_comm2(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @bitwise_or_bitwise_or_icmps_comm2(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = icmp ne i8 [[TMP2]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    [[TMP4:%.*]] = or i1 [[TMP3]], [[C1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP4]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp eq i8 %x.m1, 0
 | 
						|
  %c3 = icmp eq i8 %x.m2, 0
 | 
						|
  %or1 = or i1 %c2, %c1
 | 
						|
  %or2 = or i1 %or1, %c3
 | 
						|
  ret i1 %or2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_or_bitwise_or_icmps_comm3(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @bitwise_or_bitwise_or_icmps_comm3(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = icmp ne i8 [[TMP2]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    [[TMP4:%.*]] = or i1 [[TMP3]], [[C1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP4]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp eq i8 %x.m1, 0
 | 
						|
  %c3 = icmp eq i8 %x.m2, 0
 | 
						|
  %or1 = or i1 %c2, %c1
 | 
						|
  %or2 = or i1 %c3, %or1
 | 
						|
  ret i1 %or2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_or_logical_or_icmps(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @bitwise_or_logical_or_icmps(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = icmp ne i8 [[TMP2]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    [[TMP4:%.*]] = select i1 [[C1]], i1 true, i1 [[TMP3]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP4]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp eq i8 %x.m1, 0
 | 
						|
  %c3 = icmp eq i8 %x.m2, 0
 | 
						|
  %or1 = select i1 %c1, i1 true, i1 %c2
 | 
						|
  %or2 = or i1 %or1, %c3
 | 
						|
  ret i1 %or2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_or_logical_or_icmps_comm1(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @bitwise_or_logical_or_icmps_comm1(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = icmp ne i8 [[TMP2]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    [[TMP4:%.*]] = select i1 [[C1]], i1 true, i1 [[TMP3]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP4]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp eq i8 %x.m1, 0
 | 
						|
  %c3 = icmp eq i8 %x.m2, 0
 | 
						|
  %or1 = select i1 %c1, i1 true, i1 %c2
 | 
						|
  %or2 = or i1 %c3, %or1
 | 
						|
  ret i1 %or2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_or_logical_or_icmps_comm2(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @bitwise_or_logical_or_icmps_comm2(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = freeze i8 [[Z_SHIFT]]
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = or i8 [[TMP1]], 1
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = and i8 [[TMP2]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP4:%.*]] = icmp ne i8 [[TMP3]], [[TMP2]]
 | 
						|
; CHECK-NEXT:    [[TMP5:%.*]] = select i1 [[TMP4]], i1 true, i1 [[C1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP5]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp eq i8 %x.m1, 0
 | 
						|
  %c3 = icmp eq i8 %x.m2, 0
 | 
						|
  %or1 = select i1 %c2, i1 true, i1 %c1
 | 
						|
  %or2 = or i1 %or1, %c3
 | 
						|
  ret i1 %or2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_or_logical_or_icmps_comm3(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @bitwise_or_logical_or_icmps_comm3(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = icmp ne i8 [[TMP2]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    [[TMP4:%.*]] = select i1 [[TMP3]], i1 true, i1 [[C1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP4]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp eq i8 %x.m1, 0
 | 
						|
  %c3 = icmp eq i8 %x.m2, 0
 | 
						|
  %or1 = select i1 %c2, i1 true, i1 %c1
 | 
						|
  %or2 = or i1 %c3, %or1
 | 
						|
  ret i1 %or2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @logical_or_bitwise_or_icmps(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @logical_or_bitwise_or_icmps(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[X_M1:%.*]] = and i8 [[X:%.*]], 1
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]]
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp eq i8 [[X_M1]], 0
 | 
						|
; CHECK-NEXT:    [[C3:%.*]] = icmp eq i8 [[X_M2]], 0
 | 
						|
; CHECK-NEXT:    [[OR1:%.*]] = or i1 [[C1]], [[C2]]
 | 
						|
; CHECK-NEXT:    [[OR2:%.*]] = select i1 [[OR1]], i1 true, i1 [[C3]]
 | 
						|
; CHECK-NEXT:    ret i1 [[OR2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp eq i8 %x.m1, 0
 | 
						|
  %c3 = icmp eq i8 %x.m2, 0
 | 
						|
  %or1 = or i1 %c1, %c2
 | 
						|
  %or2 = select i1 %or1, i1 true, i1 %c3
 | 
						|
  ret i1 %or2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @logical_or_bitwise_or_icmps_comm1(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @logical_or_bitwise_or_icmps_comm1(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[X_M1:%.*]] = and i8 [[X:%.*]], 1
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]]
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp eq i8 [[X_M1]], 0
 | 
						|
; CHECK-NEXT:    [[C3:%.*]] = icmp eq i8 [[X_M2]], 0
 | 
						|
; CHECK-NEXT:    [[OR1:%.*]] = or i1 [[C1]], [[C2]]
 | 
						|
; CHECK-NEXT:    [[OR2:%.*]] = select i1 [[C3]], i1 true, i1 [[OR1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[OR2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp eq i8 %x.m1, 0
 | 
						|
  %c3 = icmp eq i8 %x.m2, 0
 | 
						|
  %or1 = or i1 %c1, %c2
 | 
						|
  %or2 = select i1 %c3, i1 true, i1 %or1
 | 
						|
  ret i1 %or2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @logical_or_bitwise_or_icmps_comm2(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @logical_or_bitwise_or_icmps_comm2(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[X_M1:%.*]] = and i8 [[X:%.*]], 1
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]]
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp eq i8 [[X_M1]], 0
 | 
						|
; CHECK-NEXT:    [[C3:%.*]] = icmp eq i8 [[X_M2]], 0
 | 
						|
; CHECK-NEXT:    [[OR1:%.*]] = or i1 [[C2]], [[C1]]
 | 
						|
; CHECK-NEXT:    [[OR2:%.*]] = select i1 [[OR1]], i1 true, i1 [[C3]]
 | 
						|
; CHECK-NEXT:    ret i1 [[OR2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp eq i8 %x.m1, 0
 | 
						|
  %c3 = icmp eq i8 %x.m2, 0
 | 
						|
  %or1 = or i1 %c2, %c1
 | 
						|
  %or2 = select i1 %or1, i1 true, i1 %c3
 | 
						|
  ret i1 %or2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @logical_or_bitwise_or_icmps_comm3(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @logical_or_bitwise_or_icmps_comm3(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[X_M1:%.*]] = and i8 [[X:%.*]], 1
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]]
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp eq i8 [[X_M1]], 0
 | 
						|
; CHECK-NEXT:    [[C3:%.*]] = icmp eq i8 [[X_M2]], 0
 | 
						|
; CHECK-NEXT:    [[OR1:%.*]] = or i1 [[C2]], [[C1]]
 | 
						|
; CHECK-NEXT:    [[OR2:%.*]] = select i1 [[C3]], i1 true, i1 [[OR1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[OR2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp eq i8 %x.m1, 0
 | 
						|
  %c3 = icmp eq i8 %x.m2, 0
 | 
						|
  %or1 = or i1 %c2, %c1
 | 
						|
  %or2 = select i1 %c3, i1 true, i1 %or1
 | 
						|
  ret i1 %or2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @logical_or_logical_or_icmps(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @logical_or_logical_or_icmps(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[X_M1:%.*]] = and i8 [[X:%.*]], 1
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]]
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp eq i8 [[X_M1]], 0
 | 
						|
; CHECK-NEXT:    [[C3:%.*]] = icmp eq i8 [[X_M2]], 0
 | 
						|
; CHECK-NEXT:    [[OR1:%.*]] = select i1 [[C1]], i1 true, i1 [[C2]]
 | 
						|
; CHECK-NEXT:    [[OR2:%.*]] = select i1 [[OR1]], i1 true, i1 [[C3]]
 | 
						|
; CHECK-NEXT:    ret i1 [[OR2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp eq i8 %x.m1, 0
 | 
						|
  %c3 = icmp eq i8 %x.m2, 0
 | 
						|
  %or1 = select i1 %c1, i1 true, i1 %c2
 | 
						|
  %or2 = select i1 %or1, i1 true, i1 %c3
 | 
						|
  ret i1 %or2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @logical_or_logical_or_icmps_comm1(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @logical_or_logical_or_icmps_comm1(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[X_M1:%.*]] = and i8 [[X:%.*]], 1
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]]
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp eq i8 [[X_M1]], 0
 | 
						|
; CHECK-NEXT:    [[C3:%.*]] = icmp eq i8 [[X_M2]], 0
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[C3]], i1 true, i1 [[C1]]
 | 
						|
; CHECK-NEXT:    [[OR2:%.*]] = select i1 [[TMP1]], i1 true, i1 [[C2]]
 | 
						|
; CHECK-NEXT:    ret i1 [[OR2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp eq i8 %x.m1, 0
 | 
						|
  %c3 = icmp eq i8 %x.m2, 0
 | 
						|
  %or1 = select i1 %c1, i1 true, i1 %c2
 | 
						|
  %or2 = select i1 %c3, i1 true, i1 %or1
 | 
						|
  ret i1 %or2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @logical_or_logical_or_icmps_comm2(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @logical_or_logical_or_icmps_comm2(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[X_M1:%.*]] = and i8 [[X:%.*]], 1
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]]
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp eq i8 [[X_M1]], 0
 | 
						|
; CHECK-NEXT:    [[C3:%.*]] = icmp eq i8 [[X_M2]], 0
 | 
						|
; CHECK-NEXT:    [[OR1:%.*]] = select i1 [[C2]], i1 true, i1 [[C1]]
 | 
						|
; CHECK-NEXT:    [[OR2:%.*]] = select i1 [[OR1]], i1 true, i1 [[C3]]
 | 
						|
; CHECK-NEXT:    ret i1 [[OR2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp eq i8 %x.m1, 0
 | 
						|
  %c3 = icmp eq i8 %x.m2, 0
 | 
						|
  %or1 = select i1 %c2, i1 true, i1 %c1
 | 
						|
  %or2 = select i1 %or1, i1 true, i1 %c3
 | 
						|
  ret i1 %or2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @logical_or_logical_or_icmps_comm3(i8 %x, i8 %y, i8 %z) {
 | 
						|
; CHECK-LABEL: @logical_or_logical_or_icmps_comm3(
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42
 | 
						|
; CHECK-NEXT:    [[Z_SHIFT:%.*]] = shl i8 1, [[Z:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = icmp ne i8 [[TMP2]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    [[OR2:%.*]] = select i1 [[TMP3]], i1 true, i1 [[C1]]
 | 
						|
; CHECK-NEXT:    ret i1 [[OR2]]
 | 
						|
;
 | 
						|
  %c1 = icmp eq i8 %y, 42
 | 
						|
  %x.m1 = and i8 %x, 1
 | 
						|
  %z.shift = shl i8 1, %z
 | 
						|
  %x.m2 = and i8 %x, %z.shift
 | 
						|
  %c2 = icmp eq i8 %x.m1, 0
 | 
						|
  %c3 = icmp eq i8 %x.m2, 0
 | 
						|
  %or1 = select i1 %c2, i1 true, i1 %c1
 | 
						|
  %or2 = select i1 %c3, i1 true, i1 %or1
 | 
						|
  ret i1 %or2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_and_logical_and_masked_icmp_asymmetric(i1 %c, i32 %x) {
 | 
						|
; CHECK-LABEL: @bitwise_and_logical_and_masked_icmp_asymmetric(
 | 
						|
; CHECK-NEXT:    [[X_M2:%.*]] = and i32 [[X:%.*]], 11
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp eq i32 [[X_M2]], 11
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[C2]], i1 [[C:%.*]], i1 false
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP1]]
 | 
						|
;
 | 
						|
  %x.m1 = and i32 %x, 255
 | 
						|
  %c1 = icmp ne i32 %x.m1, 0
 | 
						|
  %and1 = select i1 %c1, i1 %c, i1 false
 | 
						|
  %x.m2 = and i32 %x, 11
 | 
						|
  %c2 = icmp eq i32 %x.m2, 11
 | 
						|
  %and2 = and i1 %and1, %c2
 | 
						|
  ret i1 %and2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_and_logical_and_masked_icmp_allzeros(i1 %c, i32 %x) {
 | 
						|
; CHECK-LABEL: @bitwise_and_logical_and_masked_icmp_allzeros(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 15
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 0
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP2]], i1 [[C:%.*]], i1 false
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP3]]
 | 
						|
;
 | 
						|
  %x.m1 = and i32 %x, 8
 | 
						|
  %c1 = icmp eq i32 %x.m1, 0
 | 
						|
  %and1 = select i1 %c1, i1 %c, i1 false
 | 
						|
  %x.m2 = and i32 %x, 7
 | 
						|
  %c2 = icmp eq i32 %x.m2, 0
 | 
						|
  %and2 = and i1 %and1, %c2
 | 
						|
  ret i1 %and2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_and_logical_and_masked_icmp_allzeros_poison1(i1 %c, i32 %x, i32 %y) {
 | 
						|
; CHECK-LABEL: @bitwise_and_logical_and_masked_icmp_allzeros_poison1(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = or i32 [[Y:%.*]], 7
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i32 [[TMP1]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP2]], 0
 | 
						|
; CHECK-NEXT:    [[TMP4:%.*]] = select i1 [[TMP3]], i1 [[C:%.*]], i1 false
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP4]]
 | 
						|
;
 | 
						|
  %x.m1 = and i32 %x, %y
 | 
						|
  %c1 = icmp eq i32 %x.m1, 0
 | 
						|
  %and1 = select i1 %c1, i1 %c, i1 false
 | 
						|
  %x.m2 = and i32 %x, 7
 | 
						|
  %c2 = icmp eq i32 %x.m2, 0
 | 
						|
  %and2 = and i1 %and1, %c2
 | 
						|
  ret i1 %and2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_and_logical_and_masked_icmp_allzeros_poison2(i1 %c, i32 %x, i32 %y) {
 | 
						|
; CHECK-LABEL: @bitwise_and_logical_and_masked_icmp_allzeros_poison2(
 | 
						|
; CHECK-NEXT:    [[X_M1:%.*]] = and i32 [[X:%.*]], 8
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp eq i32 [[X_M1]], 0
 | 
						|
; CHECK-NEXT:    [[AND1:%.*]] = select i1 [[C1]], i1 [[C:%.*]], i1 false
 | 
						|
; CHECK-NEXT:    [[X_M2:%.*]] = and i32 [[X]], [[Y:%.*]]
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp eq i32 [[X_M2]], 0
 | 
						|
; CHECK-NEXT:    [[AND2:%.*]] = and i1 [[AND1]], [[C2]]
 | 
						|
; CHECK-NEXT:    ret i1 [[AND2]]
 | 
						|
;
 | 
						|
  %x.m1 = and i32 %x, 8
 | 
						|
  %c1 = icmp eq i32 %x.m1, 0
 | 
						|
  %and1 = select i1 %c1, i1 %c, i1 false
 | 
						|
  %x.m2 = and i32 %x, %y
 | 
						|
  %c2 = icmp eq i32 %x.m2, 0
 | 
						|
  %and2 = and i1 %and1, %c2
 | 
						|
  ret i1 %and2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_and_logical_and_masked_icmp_allones(i1 %c, i32 %x) {
 | 
						|
; CHECK-LABEL: @bitwise_and_logical_and_masked_icmp_allones(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 15
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 15
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP2]], i1 [[C:%.*]], i1 false
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP3]]
 | 
						|
;
 | 
						|
  %x.m1 = and i32 %x, 8
 | 
						|
  %c1 = icmp eq i32 %x.m1, 8
 | 
						|
  %and1 = select i1 %c1, i1 %c, i1 false
 | 
						|
  %x.m2 = and i32 %x, 7
 | 
						|
  %c2 = icmp eq i32 %x.m2, 7
 | 
						|
  %and2 = and i1 %and1, %c2
 | 
						|
  ret i1 %and2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_and_logical_and_masked_icmp_allones_poison1(i1 %c, i32 %x, i32 %y) {
 | 
						|
; CHECK-LABEL: @bitwise_and_logical_and_masked_icmp_allones_poison1(
 | 
						|
; CHECK-NEXT:    [[TMP1:%.*]] = or i32 [[Y:%.*]], 7
 | 
						|
; CHECK-NEXT:    [[TMP2:%.*]] = and i32 [[TMP1]], [[X:%.*]]
 | 
						|
; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP2]], [[TMP1]]
 | 
						|
; CHECK-NEXT:    [[TMP4:%.*]] = select i1 [[TMP3]], i1 [[C:%.*]], i1 false
 | 
						|
; CHECK-NEXT:    ret i1 [[TMP4]]
 | 
						|
;
 | 
						|
  %x.m1 = and i32 %x, %y
 | 
						|
  %c1 = icmp eq i32 %x.m1, %y
 | 
						|
  %and1 = select i1 %c1, i1 %c, i1 false
 | 
						|
  %x.m2 = and i32 %x, 7
 | 
						|
  %c2 = icmp eq i32 %x.m2, 7
 | 
						|
  %and2 = and i1 %and1, %c2
 | 
						|
  ret i1 %and2
 | 
						|
}
 | 
						|
 | 
						|
define i1 @bitwise_and_logical_and_masked_icmp_allones_poison2(i1 %c, i32 %x, i32 %y) {
 | 
						|
; CHECK-LABEL: @bitwise_and_logical_and_masked_icmp_allones_poison2(
 | 
						|
; CHECK-NEXT:    [[X_M1:%.*]] = and i32 [[X:%.*]], 8
 | 
						|
; CHECK-NEXT:    [[C1:%.*]] = icmp ne i32 [[X_M1]], 0
 | 
						|
; CHECK-NEXT:    [[AND1:%.*]] = select i1 [[C1]], i1 [[C:%.*]], i1 false
 | 
						|
; CHECK-NEXT:    [[X_M2:%.*]] = and i32 [[X]], [[Y:%.*]]
 | 
						|
; CHECK-NEXT:    [[C2:%.*]] = icmp eq i32 [[X_M2]], [[Y]]
 | 
						|
; CHECK-NEXT:    [[AND2:%.*]] = and i1 [[AND1]], [[C2]]
 | 
						|
; CHECK-NEXT:    ret i1 [[AND2]]
 | 
						|
;
 | 
						|
  %x.m1 = and i32 %x, 8
 | 
						|
  %c1 = icmp eq i32 %x.m1, 8
 | 
						|
  %and1 = select i1 %c1, i1 %c, i1 false
 | 
						|
  %x.m2 = and i32 %x, %y
 | 
						|
  %c2 = icmp eq i32 %x.m2, %y
 | 
						|
  %and2 = and i1 %and1, %c2
 | 
						|
  ret i1 %and2
 | 
						|
}
 |