xref: /llvm-project/llvm/test/Transforms/InstSimplify/smul_fix.ll (revision b280ee1dd7e9b36ae7aaa3953556e4b7a7f31a29)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -S -passes=instsimplify | FileCheck %s
3
4declare i16 @llvm.smul.fix.i16(i16, i16, i32)
5declare i16 @llvm.smul.fix.sat.i16(i16, i16, i32)
6declare <2 x i16> @llvm.smul.fix.v2i16(<2 x i16>, <2 x i16>, i32)
7declare <2 x i16> @llvm.smul.fix.sat.v2i16(<2 x i16>, <2 x i16>, i32)
8
9;;
10;; llvm.smul.fix (scalar)
11;;
12
13; X * 0 -> X
14define i16 @smul_fix_0(i16 %arg) {
15; CHECK-LABEL: @smul_fix_0(
16; CHECK-NEXT:    ret i16 0
17;
18  %res = call i16 @llvm.smul.fix.i16(i16 %arg, i16 0, i32 15)
19  ret i16 %res
20}
21
22; 0 * X -> X
23define i16 @smul_fix_1(i16 %arg) {
24; CHECK-LABEL: @smul_fix_1(
25; CHECK-NEXT:    ret i16 0
26;
27  %res = call i16 @llvm.smul.fix.i16(i16 0, i16 %arg, i32 15)
28  ret i16 %res
29}
30
31; X * undef -> undef
32define i16 @smul_fix_2(i16 %arg) {
33; CHECK-LABEL: @smul_fix_2(
34; CHECK-NEXT:    ret i16 0
35;
36  %res = call i16 @llvm.smul.fix.i16(i16 %arg, i16 undef, i32 15)
37  ret i16 %res
38}
39
40; undef * X -> undef
41define i16 @smul_fix_3(i16 %arg) {
42; CHECK-LABEL: @smul_fix_3(
43; CHECK-NEXT:    ret i16 0
44;
45  %res = call i16 @llvm.smul.fix.i16(i16 undef, i16 %arg, i32 15)
46  ret i16 %res
47}
48
49; X * 1 -> X
50define i16 @smul_fix_4(i16 %arg) {
51; CHECK-LABEL: @smul_fix_4(
52; CHECK-NEXT:    ret i16 [[ARG:%.*]]
53;
54  %res = call i16 @llvm.smul.fix.i16(i16 %arg, i16 16384, i32 14)
55  ret i16 %res
56}
57
58; 1 * X -> X
59define i16 @smul_fix_5(i16 %arg) {
60; CHECK-LABEL: @smul_fix_5(
61; CHECK-NEXT:    ret i16 [[ARG:%.*]]
62;
63  %res = call i16 @llvm.smul.fix.i16(i16 2, i16 %arg, i32 1)
64  ret i16 %res
65}
66
67;;
68;; llvm.smul.fix.sat (scalar)
69;;
70
71; X * 0 -> X
72define i16 @smul_fix_sat_0(i16 %arg) {
73; CHECK-LABEL: @smul_fix_sat_0(
74; CHECK-NEXT:    ret i16 0
75;
76  %res = call i16 @llvm.smul.fix.sat.i16(i16 %arg, i16 0, i32 15)
77  ret i16 %res
78}
79
80; 0 * X -> X
81define i16 @smul_fix_sat_1(i16 %arg) {
82; CHECK-LABEL: @smul_fix_sat_1(
83; CHECK-NEXT:    ret i16 0
84;
85  %res = call i16 @llvm.smul.fix.sat.i16(i16 0, i16 %arg, i32 15)
86  ret i16 %res
87}
88
89; X * undef -> undef
90define i16 @smul_fix_sat_2(i16 %arg) {
91; CHECK-LABEL: @smul_fix_sat_2(
92; CHECK-NEXT:    ret i16 0
93;
94  %res = call i16 @llvm.smul.fix.sat.i16(i16 %arg, i16 undef, i32 15)
95  ret i16 %res
96}
97
98; undef * X -> undef
99define i16 @smul_fix_sat_3(i16 %arg) {
100; CHECK-LABEL: @smul_fix_sat_3(
101; CHECK-NEXT:    ret i16 0
102;
103  %res = call i16 @llvm.smul.fix.sat.i16(i16 undef, i16 %arg, i32 15)
104  ret i16 %res
105}
106
107; X * 1 -> X
108define i16 @smul_fix_sat_4(i16 %arg) {
109; CHECK-LABEL: @smul_fix_sat_4(
110; CHECK-NEXT:    ret i16 [[ARG:%.*]]
111;
112  %res = call i16 @llvm.smul.fix.sat.i16(i16 %arg, i16 16384, i32 14)
113  ret i16 %res
114}
115
116; 1 * X -> X
117define i16 @smul_fix_sat_5(i16 %arg) {
118; CHECK-LABEL: @smul_fix_sat_5(
119; CHECK-NEXT:    ret i16 [[ARG:%.*]]
120;
121  %res = call i16 @llvm.smul.fix.sat.i16(i16 2, i16 %arg, i32 1)
122  ret i16 %res
123}
124
125;;
126;; llvm.smul.fix (vector)
127;;
128
129; X * 0 -> X
130define <2 x i16> @smul_fix_vec_0(<2 x i16> %arg) {
131; CHECK-LABEL: @smul_fix_vec_0(
132; CHECK-NEXT:    ret <2 x i16> zeroinitializer
133;
134  %res = call <2 x i16> @llvm.smul.fix.v2i16(<2 x i16> %arg, <2 x i16> zeroinitializer, i32 15)
135  ret <2 x i16> %res
136}
137
138; 0 * X -> X
139define <2 x i16> @smul_fix_vec_1(<2 x i16> %arg) {
140; CHECK-LABEL: @smul_fix_vec_1(
141; CHECK-NEXT:    ret <2 x i16> zeroinitializer
142;
143  %res = call <2 x i16> @llvm.smul.fix.v2i16(<2 x i16> zeroinitializer, <2 x i16> %arg, i32 15)
144  ret <2 x i16> %res
145}
146
147; X * undef -> undef
148define <2 x i16> @smul_fix_vec_2(<2 x i16> %arg) {
149; CHECK-LABEL: @smul_fix_vec_2(
150; CHECK-NEXT:    ret <2 x i16> zeroinitializer
151;
152  %res = call <2 x i16> @llvm.smul.fix.v2i16(<2 x i16> %arg, <2 x i16> undef, i32 15)
153  ret <2 x i16> %res
154}
155
156; undef * X -> undef
157define <2 x i16> @smul_fix_vec_3(<2 x i16> %arg) {
158; CHECK-LABEL: @smul_fix_vec_3(
159; CHECK-NEXT:    ret <2 x i16> zeroinitializer
160;
161  %res = call <2 x i16> @llvm.smul.fix.v2i16(<2 x i16> undef, <2 x i16> %arg, i32 15)
162  ret <2 x i16> %res
163}
164
165; X * 1 -> X
166define <2 x i16> @smul_fix_vec_4(<2 x i16> %arg) {
167; CHECK-LABEL: @smul_fix_vec_4(
168; CHECK-NEXT:    ret <2 x i16> [[ARG:%.*]]
169;
170  %res = call <2 x i16> @llvm.smul.fix.v2i16(<2 x i16> %arg, <2 x i16> <i16 16384, i16 16384>, i32 14)
171  ret <2 x i16> %res
172}
173
174; 1 * X -> X
175define <2 x i16> @smul_fix_vec_5(<2 x i16> %arg) {
176; CHECK-LABEL: @smul_fix_vec_5(
177; CHECK-NEXT:    ret <2 x i16> [[ARG:%.*]]
178;
179  %res = call <2 x i16> @llvm.smul.fix.v2i16(<2 x i16> <i16 2, i16 2>, <2 x i16> %arg, i32 1)
180  ret <2 x i16> %res
181}
182
183;;
184;; llvm.smul.fix.sat (vector)
185;;
186
187; X * 0 -> X
188define <2 x i16> @smul_fix_sat_vec_0(<2 x i16> %arg) {
189; CHECK-LABEL: @smul_fix_sat_vec_0(
190; CHECK-NEXT:    ret <2 x i16> zeroinitializer
191;
192  %res = call <2 x i16> @llvm.smul.fix.sat.v2i16(<2 x i16> %arg, <2 x i16> zeroinitializer, i32 15)
193  ret <2 x i16> %res
194}
195
196; 0 * X -> X
197define <2 x i16> @smul_fix_sat_vec_1(<2 x i16> %arg) {
198; CHECK-LABEL: @smul_fix_sat_vec_1(
199; CHECK-NEXT:    ret <2 x i16> zeroinitializer
200;
201  %res = call <2 x i16> @llvm.smul.fix.sat.v2i16(<2 x i16> zeroinitializer, <2 x i16> %arg, i32 15)
202  ret <2 x i16> %res
203}
204
205; X * undef -> undef
206define <2 x i16> @smul_fix_sat_vec_2(<2 x i16> %arg) {
207; CHECK-LABEL: @smul_fix_sat_vec_2(
208; CHECK-NEXT:    ret <2 x i16> zeroinitializer
209;
210  %res = call <2 x i16> @llvm.smul.fix.sat.v2i16(<2 x i16> %arg, <2 x i16> undef, i32 15)
211  ret <2 x i16> %res
212}
213
214; undef * X -> undef
215define <2 x i16> @smul_fix_sat_vec_3(<2 x i16> %arg) {
216; CHECK-LABEL: @smul_fix_sat_vec_3(
217; CHECK-NEXT:    ret <2 x i16> zeroinitializer
218;
219  %res = call <2 x i16> @llvm.smul.fix.sat.v2i16(<2 x i16> undef, <2 x i16> %arg, i32 15)
220  ret <2 x i16> %res
221}
222
223; X * 1 -> X
224define <2 x i16> @smul_fix_sat_vec_4(<2 x i16> %arg) {
225; CHECK-LABEL: @smul_fix_sat_vec_4(
226; CHECK-NEXT:    ret <2 x i16> [[ARG:%.*]]
227;
228  %res = call <2 x i16> @llvm.smul.fix.sat.v2i16(<2 x i16> %arg, <2 x i16> <i16 16384, i16 16384>, i32 14)
229  ret <2 x i16> %res
230}
231
232; 1 * X -> X
233define <2 x i16> @smul_fix_sat_vec_5(<2 x i16> %arg) {
234; CHECK-LABEL: @smul_fix_sat_vec_5(
235; CHECK-NEXT:    ret <2 x i16> [[ARG:%.*]]
236;
237  %res = call <2 x i16> @llvm.smul.fix.sat.v2i16(<2 x i16> <i16 2, i16 2>, <2 x i16> %arg, i32 1)
238  ret <2 x i16> %res
239}
240