xref: /llvm-project/llvm/test/Transforms/InstCombine/select-safe-impliedcond-transforms.ll (revision acdc419c897f8a9414c7a00c8908ac32312afee2)
1012f01e2SJuneyoung Lee; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*acdc419cSBjorn Pettersson; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3012f01e2SJuneyoung Lee
4012f01e2SJuneyoung Leedefine i1 @a_true_implies_b_true(i8 %z, i1 %X, i1 %Y) {
5012f01e2SJuneyoung Lee; CHECK-LABEL: @a_true_implies_b_true(
6012f01e2SJuneyoung Lee; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 20
724ce194cSJuneyoung Lee; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 [[X:%.*]], i1 false
8012f01e2SJuneyoung Lee; CHECK-NEXT:    ret i1 [[RES]]
9012f01e2SJuneyoung Lee;
10012f01e2SJuneyoung Lee  %a = icmp ugt i8 %z, 20
11012f01e2SJuneyoung Lee  %b = icmp ugt i8 %z, 10
12012f01e2SJuneyoung Lee  %sel = select i1 %b, i1 %X, i1 %Y
13012f01e2SJuneyoung Lee  %res = select i1 %a, i1 %sel, i1 false
14012f01e2SJuneyoung Lee  ret i1 %res
15012f01e2SJuneyoung Lee}
16012f01e2SJuneyoung Lee
17012f01e2SJuneyoung Leedefine <2 x i1> @a_true_implies_b_true_vec(i8 %z0, <2 x i1> %X, <2 x i1> %Y) {
18012f01e2SJuneyoung Lee; CHECK-LABEL: @a_true_implies_b_true_vec(
19e6ad9ef4SPhilip Reames; CHECK-NEXT:    [[A0:%.*]] = insertelement <2 x i8> poison, i8 [[Z0:%.*]], i64 0
20012f01e2SJuneyoung Lee; CHECK-NEXT:    [[Z:%.*]] = shufflevector <2 x i8> [[A0]], <2 x i8> poison, <2 x i32> zeroinitializer
21012f01e2SJuneyoung Lee; CHECK-NEXT:    [[A:%.*]] = icmp ugt <2 x i8> [[Z]], <i8 20, i8 19>
22012f01e2SJuneyoung Lee; CHECK-NEXT:    [[B:%.*]] = icmp ugt i8 [[Z0]], 10
23012f01e2SJuneyoung Lee; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[B]], <2 x i1> [[X:%.*]], <2 x i1> [[Y:%.*]]
24012f01e2SJuneyoung Lee; CHECK-NEXT:    [[RES:%.*]] = select <2 x i1> [[A]], <2 x i1> [[SEL]], <2 x i1> zeroinitializer
25012f01e2SJuneyoung Lee; CHECK-NEXT:    ret <2 x i1> [[RES]]
26012f01e2SJuneyoung Lee;
27012f01e2SJuneyoung Lee
28012f01e2SJuneyoung Lee  %a0 = insertelement <2 x i8> poison, i8 %z0, i8 0
29012f01e2SJuneyoung Lee  %z = shufflevector <2 x i8> %a0, <2 x i8> poison, <2 x i32> zeroinitializer
30012f01e2SJuneyoung Lee  %a = icmp ugt <2 x i8> %z, <i8 20, i8 19>
31012f01e2SJuneyoung Lee  %b = icmp ugt i8 %z0, 10
32012f01e2SJuneyoung Lee  %sel = select i1 %b, <2 x i1> %X, <2 x i1> %Y
33012f01e2SJuneyoung Lee  %res = select <2 x i1> %a, <2 x i1> %sel, <2 x i1> zeroinitializer
34012f01e2SJuneyoung Lee  ret <2 x i1> %res
35012f01e2SJuneyoung Lee}
36012f01e2SJuneyoung Lee
37012f01e2SJuneyoung Leedefine i1 @a_true_implies_b_true2(i8 %z, i1 %X, i1 %Y) {
38012f01e2SJuneyoung Lee; CHECK-LABEL: @a_true_implies_b_true2(
39012f01e2SJuneyoung Lee; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 20
4024ce194cSJuneyoung Lee; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 [[X:%.*]], i1 false
41012f01e2SJuneyoung Lee; CHECK-NEXT:    ret i1 [[RES]]
42012f01e2SJuneyoung Lee;
43012f01e2SJuneyoung Lee  %a = icmp ugt i8 %z, 20
44012f01e2SJuneyoung Lee  %b = icmp ugt i8 %z, 10
45012f01e2SJuneyoung Lee  %sel = select i1 %b, i1 %X, i1 %Y
46012f01e2SJuneyoung Lee  %res = and i1 %a, %sel
47012f01e2SJuneyoung Lee  ret i1 %res
48012f01e2SJuneyoung Lee}
49012f01e2SJuneyoung Lee
50012f01e2SJuneyoung Leedefine i1 @a_true_implies_b_true2_comm(i8 %z, i1 %X, i1 %Y) {
51012f01e2SJuneyoung Lee; CHECK-LABEL: @a_true_implies_b_true2_comm(
52012f01e2SJuneyoung Lee; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 20
5324ce194cSJuneyoung Lee; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 [[X:%.*]], i1 false
54012f01e2SJuneyoung Lee; CHECK-NEXT:    ret i1 [[RES]]
55012f01e2SJuneyoung Lee;
56012f01e2SJuneyoung Lee  %a = icmp ugt i8 %z, 20
57012f01e2SJuneyoung Lee  %b = icmp ugt i8 %z, 10
58012f01e2SJuneyoung Lee  %sel = select i1 %b, i1 %X, i1 %Y
59012f01e2SJuneyoung Lee  %res = and i1 %sel, %a
60012f01e2SJuneyoung Lee  ret i1 %res
61012f01e2SJuneyoung Lee}
62012f01e2SJuneyoung Lee
63012f01e2SJuneyoung Leedefine i1 @a_true_implies_b_false(i8 %z, i1 %X, i1 %Y) {
64012f01e2SJuneyoung Lee; CHECK-LABEL: @a_true_implies_b_false(
65012f01e2SJuneyoung Lee; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 20
6624ce194cSJuneyoung Lee; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 [[Y:%.*]], i1 false
67012f01e2SJuneyoung Lee; CHECK-NEXT:    ret i1 [[RES]]
68012f01e2SJuneyoung Lee;
69012f01e2SJuneyoung Lee  %a = icmp ugt i8 %z, 20
70012f01e2SJuneyoung Lee  %b = icmp ult i8 %z, 10
71012f01e2SJuneyoung Lee  %sel = select i1 %b, i1 %X, i1 %Y
72012f01e2SJuneyoung Lee  %res = select i1 %a, i1 %sel, i1 false
73012f01e2SJuneyoung Lee  ret i1 %res
74012f01e2SJuneyoung Lee}
75012f01e2SJuneyoung Lee
76012f01e2SJuneyoung Leedefine i1 @a_true_implies_b_false2(i8 %z, i1 %X, i1 %Y) {
77012f01e2SJuneyoung Lee; CHECK-LABEL: @a_true_implies_b_false2(
78012f01e2SJuneyoung Lee; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 20
7924ce194cSJuneyoung Lee; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 [[Y:%.*]], i1 false
80012f01e2SJuneyoung Lee; CHECK-NEXT:    ret i1 [[RES]]
81012f01e2SJuneyoung Lee;
82012f01e2SJuneyoung Lee  %a = icmp ugt i8 %z, 20
83012f01e2SJuneyoung Lee  %b = icmp eq i8 %z, 10
84012f01e2SJuneyoung Lee  %sel = select i1 %b, i1 %X, i1 %Y
85012f01e2SJuneyoung Lee  %res = and i1 %a, %sel
86012f01e2SJuneyoung Lee  ret i1 %res
87012f01e2SJuneyoung Lee}
88012f01e2SJuneyoung Lee
89012f01e2SJuneyoung Leedefine i1 @a_true_implies_b_false2_comm(i8 %z, i1 %X, i1 %Y) {
90012f01e2SJuneyoung Lee; CHECK-LABEL: @a_true_implies_b_false2_comm(
91012f01e2SJuneyoung Lee; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 20
9224ce194cSJuneyoung Lee; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 [[Y:%.*]], i1 false
93012f01e2SJuneyoung Lee; CHECK-NEXT:    ret i1 [[RES]]
94012f01e2SJuneyoung Lee;
95012f01e2SJuneyoung Lee  %a = icmp ugt i8 %z, 20
96012f01e2SJuneyoung Lee  %b = icmp eq i8 %z, 10
97012f01e2SJuneyoung Lee  %sel = select i1 %b, i1 %X, i1 %Y
98012f01e2SJuneyoung Lee  %res = and i1 %sel, %a
99012f01e2SJuneyoung Lee  ret i1 %res
100012f01e2SJuneyoung Lee}
101012f01e2SJuneyoung Lee
102012f01e2SJuneyoung Leedefine i1 @a_false_implies_b_true(i8 %z, i1 %X, i1 %Y) {
103012f01e2SJuneyoung Lee; CHECK-LABEL: @a_false_implies_b_true(
104012f01e2SJuneyoung Lee; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 10
10524ce194cSJuneyoung Lee; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 true, i1 [[X:%.*]]
106012f01e2SJuneyoung Lee; CHECK-NEXT:    ret i1 [[RES]]
107012f01e2SJuneyoung Lee;
108012f01e2SJuneyoung Lee  %a = icmp ugt i8 %z, 10
109012f01e2SJuneyoung Lee  %b = icmp ult i8 %z, 20
110012f01e2SJuneyoung Lee  %sel = select i1 %b, i1 %X, i1 %Y
111012f01e2SJuneyoung Lee  %res = select i1 %a, i1 true, i1 %sel
112012f01e2SJuneyoung Lee  ret i1 %res
113012f01e2SJuneyoung Lee}
114012f01e2SJuneyoung Lee
115012f01e2SJuneyoung Leedefine i1 @a_false_implies_b_true2(i8 %z, i1 %X, i1 %Y) {
116012f01e2SJuneyoung Lee; CHECK-LABEL: @a_false_implies_b_true2(
117012f01e2SJuneyoung Lee; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 10
11824ce194cSJuneyoung Lee; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 true, i1 [[X:%.*]]
119012f01e2SJuneyoung Lee; CHECK-NEXT:    ret i1 [[RES]]
120012f01e2SJuneyoung Lee;
121012f01e2SJuneyoung Lee  %a = icmp ugt i8 %z, 10
122012f01e2SJuneyoung Lee  %b = icmp ult i8 %z, 20
123012f01e2SJuneyoung Lee  %sel = select i1 %b, i1 %X, i1 %Y
124012f01e2SJuneyoung Lee  %res = or i1 %a, %sel
125012f01e2SJuneyoung Lee  ret i1 %res
126012f01e2SJuneyoung Lee}
127012f01e2SJuneyoung Lee
128012f01e2SJuneyoung Leedefine i1 @a_false_implies_b_true2_comm(i8 %z, i1 %X, i1 %Y) {
129012f01e2SJuneyoung Lee; CHECK-LABEL: @a_false_implies_b_true2_comm(
130012f01e2SJuneyoung Lee; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 10
13124ce194cSJuneyoung Lee; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 true, i1 [[X:%.*]]
132012f01e2SJuneyoung Lee; CHECK-NEXT:    ret i1 [[RES]]
133012f01e2SJuneyoung Lee;
134012f01e2SJuneyoung Lee  %a = icmp ugt i8 %z, 10
135012f01e2SJuneyoung Lee  %b = icmp ult i8 %z, 20
136012f01e2SJuneyoung Lee  %sel = select i1 %b, i1 %X, i1 %Y
137012f01e2SJuneyoung Lee  %res = or i1 %sel, %a
138012f01e2SJuneyoung Lee  ret i1 %res
139012f01e2SJuneyoung Lee}
140012f01e2SJuneyoung Lee
141012f01e2SJuneyoung Leedefine i1 @a_false_implies_b_false(i8 %z, i1 %X, i1 %Y) {
142012f01e2SJuneyoung Lee; CHECK-LABEL: @a_false_implies_b_false(
143012f01e2SJuneyoung Lee; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 10
14424ce194cSJuneyoung Lee; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 true, i1 [[Y:%.*]]
145012f01e2SJuneyoung Lee; CHECK-NEXT:    ret i1 [[RES]]
146012f01e2SJuneyoung Lee;
147012f01e2SJuneyoung Lee  %a = icmp ugt i8 %z, 10
148012f01e2SJuneyoung Lee  %b = icmp ugt i8 %z, 20
149012f01e2SJuneyoung Lee  %sel = select i1 %b, i1 %X, i1 %Y
150012f01e2SJuneyoung Lee  %res = select i1 %a, i1 true, i1 %sel
151012f01e2SJuneyoung Lee  ret i1 %res
152012f01e2SJuneyoung Lee}
153012f01e2SJuneyoung Lee
154012f01e2SJuneyoung Leedefine i1 @a_false_implies_b_false2(i8 %z, i1 %X, i1 %Y) {
155012f01e2SJuneyoung Lee; CHECK-LABEL: @a_false_implies_b_false2(
156012f01e2SJuneyoung Lee; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 10
15724ce194cSJuneyoung Lee; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 true, i1 [[Y:%.*]]
158012f01e2SJuneyoung Lee; CHECK-NEXT:    ret i1 [[RES]]
159012f01e2SJuneyoung Lee;
160012f01e2SJuneyoung Lee  %a = icmp ugt i8 %z, 10
161012f01e2SJuneyoung Lee  %b = icmp ugt i8 %z, 20
162012f01e2SJuneyoung Lee  %sel = select i1 %b, i1 %X, i1 %Y
163012f01e2SJuneyoung Lee  %res = or i1 %a, %sel
164012f01e2SJuneyoung Lee  ret i1 %res
165012f01e2SJuneyoung Lee}
166012f01e2SJuneyoung Lee
167012f01e2SJuneyoung Leedefine i1 @a_false_implies_b_false2_comm(i8 %z, i1 %X, i1 %Y) {
168012f01e2SJuneyoung Lee; CHECK-LABEL: @a_false_implies_b_false2_comm(
169012f01e2SJuneyoung Lee; CHECK-NEXT:    [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 10
17024ce194cSJuneyoung Lee; CHECK-NEXT:    [[RES:%.*]] = select i1 [[A]], i1 true, i1 [[Y:%.*]]
171012f01e2SJuneyoung Lee; CHECK-NEXT:    ret i1 [[RES]]
172012f01e2SJuneyoung Lee;
173012f01e2SJuneyoung Lee  %a = icmp ugt i8 %z, 10
174012f01e2SJuneyoung Lee  %b = icmp ugt i8 %z, 20
175012f01e2SJuneyoung Lee  %sel = select i1 %b, i1 %X, i1 %Y
176012f01e2SJuneyoung Lee  %res = or i1 %sel, %a
177012f01e2SJuneyoung Lee  ret i1 %res
178012f01e2SJuneyoung Lee}
179