1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -S -passes=instcombine < %s | FileCheck %s
4 define i1 @sgt_3_impliesF_eq_2(i8 %x, i8 %y) {
5 ; CHECK-LABEL: @sgt_3_impliesF_eq_2(
6 ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], 4
7 ; CHECK-NEXT: [[CMP21:%.*]] = icmp eq i8 [[Y:%.*]], [[X]]
8 ; CHECK-NEXT: [[CMP2:%.*]] = select i1 [[CMP]], i1 [[CMP21]], i1 false
9 ; CHECK-NEXT: ret i1 [[CMP2]]
11 %cmp = icmp sgt i8 %x, 3
12 %sel = select i1 %cmp, i8 2, i8 %y
13 %cmp2 = icmp eq i8 %sel, %x
17 define i1 @sgt_3_impliesT_sgt_2(i8 %x, i8 %y) {
18 ; CHECK-LABEL: @sgt_3_impliesT_sgt_2(
19 ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], 4
20 ; CHECK-NEXT: [[CMP21:%.*]] = icmp sgt i8 [[Y:%.*]], [[X]]
21 ; CHECK-NEXT: [[CMP2:%.*]] = select i1 [[CMP]], i1 [[CMP21]], i1 false
22 ; CHECK-NEXT: ret i1 [[CMP2]]
24 %cmp = icmp sgt i8 %x, 3
25 %sel = select i1 %cmp, i8 2, i8 %y
26 %cmp2 = icmp sgt i8 %sel, %x
30 define i1 @sgt_x_impliesF_eq_smin_todo(i8 %x, i8 %y, i8 %z) {
31 ; CHECK-LABEL: @sgt_x_impliesF_eq_smin_todo(
32 ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[X:%.*]], [[Z:%.*]]
33 ; CHECK-NEXT: [[CMP21:%.*]] = icmp eq i8 [[Y:%.*]], [[X]]
34 ; CHECK-NEXT: [[CMP2:%.*]] = select i1 [[CMP]], i1 [[CMP21]], i1 false
35 ; CHECK-NEXT: ret i1 [[CMP2]]
37 %cmp = icmp sgt i8 %x, %z
38 %sel = select i1 %cmp, i8 -128, i8 %y
39 %cmp2 = icmp eq i8 %sel, %x
43 define i1 @slt_x_impliesT_ne_smin_todo(i8 %x, i8 %y, i8 %z) {
44 ; CHECK-LABEL: @slt_x_impliesT_ne_smin_todo(
45 ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], [[Z:%.*]]
46 ; CHECK-NEXT: [[CMP21:%.*]] = icmp ne i8 [[Y:%.*]], [[X]]
47 ; CHECK-NEXT: [[CMP2:%.*]] = select i1 [[CMP]], i1 true, i1 [[CMP21]]
48 ; CHECK-NEXT: ret i1 [[CMP2]]
50 %cmp = icmp slt i8 %x, %z
51 %sel = select i1 %cmp, i8 127, i8 %y
52 %cmp2 = icmp ne i8 %x, %sel
56 define i1 @ult_x_impliesT_eq_umax_todo(i8 %x, i8 %y, i8 %z) {
57 ; CHECK-LABEL: @ult_x_impliesT_eq_umax_todo(
58 ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[Z:%.*]], [[X:%.*]]
59 ; CHECK-NEXT: [[CMP21:%.*]] = icmp ne i8 [[Y:%.*]], [[X]]
60 ; CHECK-NEXT: [[CMP2:%.*]] = select i1 [[CMP]], i1 true, i1 [[CMP21]]
61 ; CHECK-NEXT: ret i1 [[CMP2]]
63 %cmp = icmp ugt i8 %z, %x
64 %sel = select i1 %cmp, i8 255, i8 %y
65 %cmp2 = icmp ne i8 %sel, %x
69 define i1 @ult_1_impliesF_eq_1(i8 %x, i8 %y) {
70 ; CHECK-LABEL: @ult_1_impliesF_eq_1(
71 ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[X:%.*]], 0
72 ; CHECK-NEXT: [[CMP21:%.*]] = icmp eq i8 [[Y:%.*]], [[X]]
73 ; CHECK-NEXT: [[CMP2:%.*]] = select i1 [[CMP]], i1 [[CMP21]], i1 false
74 ; CHECK-NEXT: ret i1 [[CMP2]]
76 %cmp = icmp ult i8 %x, 1
77 %sel = select i1 %cmp, i8 1, i8 %y
78 %cmp2 = icmp eq i8 %x, %sel
82 define i1 @ugt_x_impliesF_eq_umin_todo(i8 %x, i8 %y, i8 %z) {
83 ; CHECK-LABEL: @ugt_x_impliesF_eq_umin_todo(
84 ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[Z:%.*]], [[X:%.*]]
85 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 0, i8 [[Y:%.*]]
86 ; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[X]], [[SEL]]
87 ; CHECK-NEXT: ret i1 [[CMP2]]
89 %cmp = icmp ugt i8 %z, %x
90 %sel = select i1 %cmp, i8 0, i8 %y
91 %cmp2 = icmp eq i8 %x, %sel