1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -instcombine -S | FileCheck %s
3
4define i1 @a_true_implies_b_true(i8 %z, i1 %X, i1 %Y) {
5; CHECK-LABEL: @a_true_implies_b_true(
6; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 20
7; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 [[X:%.*]], i1 false
8; CHECK-NEXT:    ret i1 [[RES]]
9;
10  %a = icmp ugt i8 %z, 20
11  %b = icmp ugt i8 %z, 10
12  %sel = select i1 %b, i1 %X, i1 %Y
13  %res = select i1 %a, i1 %sel, i1 false
14  ret i1 %res
15}
16
17define <2 x i1> @a_true_implies_b_true_vec(i8 %z0, <2 x i1> %X, <2 x i1> %Y) {
18; CHECK-LABEL: @a_true_implies_b_true_vec(
19; CHECK-NEXT:    [[A0:%.*]] = insertelement <2 x i8> poison, i8 [[Z0:%.*]], i8 0
20; CHECK-NEXT:    [[Z:%.*]] = shufflevector <2 x i8> [[A0]], <2 x i8> poison, <2 x i32> zeroinitializer
21; CHECK-NEXT:    [[A:%.*]] = icmp ugt <2 x i8> [[Z]], <i8 20, i8 19>
22; CHECK-NEXT:    [[B:%.*]] = icmp ugt i8 [[Z0]], 10
23; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[B]], <2 x i1> [[X:%.*]], <2 x i1> [[Y:%.*]]
24; CHECK-NEXT:    [[RES:%.*]] = select <2 x i1> [[A]], <2 x i1> [[SEL]], <2 x i1> zeroinitializer
25; CHECK-NEXT:    ret <2 x i1> [[RES]]
26;
27
28  %a0 = insertelement <2 x i8> poison, i8 %z0, i8 0
29  %z = shufflevector <2 x i8> %a0, <2 x i8> poison, <2 x i32> zeroinitializer
30  %a = icmp ugt <2 x i8> %z, <i8 20, i8 19>
31  %b = icmp ugt i8 %z0, 10
32  %sel = select i1 %b, <2 x i1> %X, <2 x i1> %Y
33  %res = select <2 x i1> %a, <2 x i1> %sel, <2 x i1> zeroinitializer
34  ret <2 x i1> %res
35}
36
37define i1 @a_true_implies_b_true2(i8 %z, i1 %X, i1 %Y) {
38; CHECK-LABEL: @a_true_implies_b_true2(
39; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 20
40; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 [[X:%.*]], i1 false
41; CHECK-NEXT:    ret i1 [[RES]]
42;
43  %a = icmp ugt i8 %z, 20
44  %b = icmp ugt i8 %z, 10
45  %sel = select i1 %b, i1 %X, i1 %Y
46  %res = and i1 %a, %sel
47  ret i1 %res
48}
49
50define i1 @a_true_implies_b_true2_comm(i8 %z, i1 %X, i1 %Y) {
51; CHECK-LABEL: @a_true_implies_b_true2_comm(
52; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 20
53; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 [[X:%.*]], i1 false
54; CHECK-NEXT:    ret i1 [[RES]]
55;
56  %a = icmp ugt i8 %z, 20
57  %b = icmp ugt i8 %z, 10
58  %sel = select i1 %b, i1 %X, i1 %Y
59  %res = and i1 %sel, %a
60  ret i1 %res
61}
62
63define i1 @a_true_implies_b_false(i8 %z, i1 %X, i1 %Y) {
64; CHECK-LABEL: @a_true_implies_b_false(
65; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 20
66; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 [[Y:%.*]], i1 false
67; CHECK-NEXT:    ret i1 [[RES]]
68;
69  %a = icmp ugt i8 %z, 20
70  %b = icmp ult i8 %z, 10
71  %sel = select i1 %b, i1 %X, i1 %Y
72  %res = select i1 %a, i1 %sel, i1 false
73  ret i1 %res
74}
75
76define i1 @a_true_implies_b_false2(i8 %z, i1 %X, i1 %Y) {
77; CHECK-LABEL: @a_true_implies_b_false2(
78; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 20
79; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 [[Y:%.*]], i1 false
80; CHECK-NEXT:    ret i1 [[RES]]
81;
82  %a = icmp ugt i8 %z, 20
83  %b = icmp eq i8 %z, 10
84  %sel = select i1 %b, i1 %X, i1 %Y
85  %res = and i1 %a, %sel
86  ret i1 %res
87}
88
89define i1 @a_true_implies_b_false2_comm(i8 %z, i1 %X, i1 %Y) {
90; CHECK-LABEL: @a_true_implies_b_false2_comm(
91; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 20
92; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 [[Y:%.*]], i1 false
93; CHECK-NEXT:    ret i1 [[RES]]
94;
95  %a = icmp ugt i8 %z, 20
96  %b = icmp eq i8 %z, 10
97  %sel = select i1 %b, i1 %X, i1 %Y
98  %res = and i1 %sel, %a
99  ret i1 %res
100}
101
102define i1 @a_false_implies_b_true(i8 %z, i1 %X, i1 %Y) {
103; CHECK-LABEL: @a_false_implies_b_true(
104; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 10
105; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 true, i1 [[X:%.*]]
106; CHECK-NEXT:    ret i1 [[RES]]
107;
108  %a = icmp ugt i8 %z, 10
109  %b = icmp ult i8 %z, 20
110  %sel = select i1 %b, i1 %X, i1 %Y
111  %res = select i1 %a, i1 true, i1 %sel
112  ret i1 %res
113}
114
115define i1 @a_false_implies_b_true2(i8 %z, i1 %X, i1 %Y) {
116; CHECK-LABEL: @a_false_implies_b_true2(
117; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 10
118; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 true, i1 [[X:%.*]]
119; CHECK-NEXT:    ret i1 [[RES]]
120;
121  %a = icmp ugt i8 %z, 10
122  %b = icmp ult i8 %z, 20
123  %sel = select i1 %b, i1 %X, i1 %Y
124  %res = or i1 %a, %sel
125  ret i1 %res
126}
127
128define i1 @a_false_implies_b_true2_comm(i8 %z, i1 %X, i1 %Y) {
129; CHECK-LABEL: @a_false_implies_b_true2_comm(
130; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 10
131; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 true, i1 [[X:%.*]]
132; CHECK-NEXT:    ret i1 [[RES]]
133;
134  %a = icmp ugt i8 %z, 10
135  %b = icmp ult i8 %z, 20
136  %sel = select i1 %b, i1 %X, i1 %Y
137  %res = or i1 %sel, %a
138  ret i1 %res
139}
140
141define i1 @a_false_implies_b_false(i8 %z, i1 %X, i1 %Y) {
142; CHECK-LABEL: @a_false_implies_b_false(
143; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 10
144; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 true, i1 [[Y:%.*]]
145; CHECK-NEXT:    ret i1 [[RES]]
146;
147  %a = icmp ugt i8 %z, 10
148  %b = icmp ugt i8 %z, 20
149  %sel = select i1 %b, i1 %X, i1 %Y
150  %res = select i1 %a, i1 true, i1 %sel
151  ret i1 %res
152}
153
154define i1 @a_false_implies_b_false2(i8 %z, i1 %X, i1 %Y) {
155; CHECK-LABEL: @a_false_implies_b_false2(
156; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 10
157; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 true, i1 [[Y:%.*]]
158; CHECK-NEXT:    ret i1 [[RES]]
159;
160  %a = icmp ugt i8 %z, 10
161  %b = icmp ugt i8 %z, 20
162  %sel = select i1 %b, i1 %X, i1 %Y
163  %res = or i1 %a, %sel
164  ret i1 %res
165}
166
167define i1 @a_false_implies_b_false2_comm(i8 %z, i1 %X, i1 %Y) {
168; CHECK-LABEL: @a_false_implies_b_false2_comm(
169; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 10
170; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 true, i1 [[Y:%.*]]
171; CHECK-NEXT:    ret i1 [[RES]]
172;
173  %a = icmp ugt i8 %z, 10
174  %b = icmp ugt i8 %z, 20
175  %sel = select i1 %b, i1 %X, i1 %Y
176  %res = or i1 %sel, %a
177  ret i1 %res
178}
179