xref: /llvm-project/llvm/test/Transforms/InstSimplify/ConstProp/funnel-shift.ll (revision b280ee1dd7e9b36ae7aaa3953556e4b7a7f31a29)
1486ed885SArthur Eubanks; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*b280ee1dSBjorn Pettersson; RUN: opt < %s -passes=instsimplify -S -o - | FileCheck %s
3486ed885SArthur Eubanks
4486ed885SArthur Eubanksdeclare i32 @llvm.fshl.i32(i32, i32, i32)
5486ed885SArthur Eubanksdeclare i32 @llvm.fshr.i32(i32, i32, i32)
6486ed885SArthur Eubanksdeclare i7 @llvm.fshl.i7(i7, i7, i7)
7486ed885SArthur Eubanksdeclare i7 @llvm.fshr.i7(i7, i7, i7)
8486ed885SArthur Eubanksdeclare <4 x i8> @llvm.fshl.v4i8(<4 x i8>, <4 x i8>, <4 x i8>)
9486ed885SArthur Eubanksdeclare <4 x i8> @llvm.fshr.v4i8(<4 x i8>, <4 x i8>, <4 x i8>)
10486ed885SArthur Eubanks
11486ed885SArthur Eubanks; extract(concat(0x12345678, 0xABCDEF01) << 5) = 0x468ACF15
12486ed885SArthur Eubanks
13486ed885SArthur Eubanksdefine i32 @fshl_i32() {
14486ed885SArthur Eubanks; CHECK-LABEL: @fshl_i32(
15486ed885SArthur Eubanks; CHECK-NEXT:    ret i32 1183502101
16486ed885SArthur Eubanks;
17486ed885SArthur Eubanks  %f = call i32 @llvm.fshl.i32(i32 305419896, i32 2882400001, i32 5)
18486ed885SArthur Eubanks  ret i32 %f
19486ed885SArthur Eubanks}
20486ed885SArthur Eubanks
21486ed885SArthur Eubanks; extract(concat(0x12345678, 0xABCDEF01) >> 5) = 0xC55E6F78
22486ed885SArthur Eubanks; Try an oversized shift to test modulo functionality.
23486ed885SArthur Eubanks
24486ed885SArthur Eubanksdefine i32 @fshr_i32() {
25486ed885SArthur Eubanks; CHECK-LABEL: @fshr_i32(
26486ed885SArthur Eubanks; CHECK-NEXT:    ret i32 -983666824
27486ed885SArthur Eubanks;
28486ed885SArthur Eubanks  %f = call i32 @llvm.fshr.i32(i32 305419896, i32 2882400001, i32 37)
29486ed885SArthur Eubanks  ret i32 %f
30486ed885SArthur Eubanks}
31486ed885SArthur Eubanks
32486ed885SArthur Eubanks; Use a weird type.
33486ed885SArthur Eubanks; Try an oversized shift to test modulo functionality.
34486ed885SArthur Eubanks
35486ed885SArthur Eubanks; extract(concat(0b1110000, 0b1111111) << 2) = 0b1000011
36486ed885SArthur Eubanks
37486ed885SArthur Eubanksdefine i7 @fshl_i7() {
38486ed885SArthur Eubanks; CHECK-LABEL: @fshl_i7(
39486ed885SArthur Eubanks; CHECK-NEXT:    ret i7 -61
40486ed885SArthur Eubanks;
41486ed885SArthur Eubanks  %f = call i7 @llvm.fshl.i7(i7 112, i7 127, i7 9)
42486ed885SArthur Eubanks  ret i7 %f
43486ed885SArthur Eubanks}
44486ed885SArthur Eubanks
45486ed885SArthur Eubanks; extract(concat(0b1110000, 0b1111111) >> 2) = 0b0011111
46486ed885SArthur Eubanks; Try an oversized shift to test modulo functionality.
47486ed885SArthur Eubanks
48486ed885SArthur Eubanksdefine i7 @fshr_i7() {
49486ed885SArthur Eubanks; CHECK-LABEL: @fshr_i7(
50486ed885SArthur Eubanks; CHECK-NEXT:    ret i7 31
51486ed885SArthur Eubanks;
52486ed885SArthur Eubanks  %f = call i7 @llvm.fshr.i7(i7 112, i7 127, i7 16)
53486ed885SArthur Eubanks  ret i7 %f
54486ed885SArthur Eubanks}
55486ed885SArthur Eubanks
56486ed885SArthur Eubanks; Vectors are folded by handling each scalar element individually, so this is the equivalent of 4 scalar tests:
57486ed885SArthur Eubanks; extract(concat(0x00, 0xFF) << 0) = 0x00
58486ed885SArthur Eubanks; extract(concat(0xFF, 0x00) << 0) = 0xFF
59486ed885SArthur Eubanks; extract(concat(0x10, 0x55) << 1) = 0x20
60486ed885SArthur Eubanks; extract(concat(0x11, 0xAA) << 2) = 0x46
61486ed885SArthur Eubanks
62486ed885SArthur Eubanksdefine <4 x i8> @fshl_v4i8() {
63486ed885SArthur Eubanks; CHECK-LABEL: @fshl_v4i8(
64486ed885SArthur Eubanks; CHECK-NEXT:    ret <4 x i8> <i8 0, i8 -1, i8 32, i8 70>
65486ed885SArthur Eubanks;
66486ed885SArthur Eubanks  %f = call <4 x i8> @llvm.fshl.v4i8(<4 x i8> <i8 0, i8 -1, i8 16, i8 17>, <4 x i8> <i8 -1, i8 0, i8 85, i8 170>, <4 x i8> <i8 0, i8 8, i8 9, i8 10>)
67486ed885SArthur Eubanks  ret <4 x i8> %f
68486ed885SArthur Eubanks}
69486ed885SArthur Eubanks
70486ed885SArthur Eubanks; Vectors are folded by handling each scalar element individually, so this is the equivalent of 4 scalar tests:
71486ed885SArthur Eubanks; extract(concat(0x00, 0xFF) >> 0) = 0xFF
72486ed885SArthur Eubanks; extract(concat(0xFF, 0x00) >> 0) = 0x00
73486ed885SArthur Eubanks; extract(concat(0x10, 0x55) >> 1) = 0x2A
74486ed885SArthur Eubanks; extract(concat(0x11, 0xAA) >> 2) = 0x6A
75486ed885SArthur Eubanks
76486ed885SArthur Eubanksdefine <4 x i8> @fshr_v4i8() {
77486ed885SArthur Eubanks; CHECK-LABEL: @fshr_v4i8(
78486ed885SArthur Eubanks; CHECK-NEXT:    ret <4 x i8> <i8 -1, i8 0, i8 42, i8 106>
79486ed885SArthur Eubanks;
80486ed885SArthur Eubanks  %f = call <4 x i8> @llvm.fshr.v4i8(<4 x i8> <i8 0, i8 -1, i8 16, i8 17>, <4 x i8> <i8 -1, i8 0, i8 85, i8 170>, <4 x i8> <i8 0, i8 8, i8 9, i8 10>)
81486ed885SArthur Eubanks  ret <4 x i8> %f
82486ed885SArthur Eubanks}
83486ed885SArthur Eubanks
84486ed885SArthur Eubanks; Undef handling
85486ed885SArthur Eubanks
86486ed885SArthur Eubanksdefine i32 @fshl_scalar_all_undef() {
87486ed885SArthur Eubanks; CHECK-LABEL: @fshl_scalar_all_undef(
88486ed885SArthur Eubanks; CHECK-NEXT:    ret i32 undef
89486ed885SArthur Eubanks;
90486ed885SArthur Eubanks  %f = call i32 @llvm.fshl.i32(i32 undef, i32 undef, i32 undef)
91486ed885SArthur Eubanks  ret i32 %f
92486ed885SArthur Eubanks}
93486ed885SArthur Eubanks
94486ed885SArthur Eubanksdefine i32 @fshr_scalar_all_undef() {
95486ed885SArthur Eubanks; CHECK-LABEL: @fshr_scalar_all_undef(
96486ed885SArthur Eubanks; CHECK-NEXT:    ret i32 undef
97486ed885SArthur Eubanks;
98486ed885SArthur Eubanks  %f = call i32 @llvm.fshr.i32(i32 undef, i32 undef, i32 undef)
99486ed885SArthur Eubanks  ret i32 %f
100486ed885SArthur Eubanks}
101486ed885SArthur Eubanks
102486ed885SArthur Eubanksdefine i32 @fshl_scalar_undef_shamt() {
103486ed885SArthur Eubanks; CHECK-LABEL: @fshl_scalar_undef_shamt(
104486ed885SArthur Eubanks; CHECK-NEXT:    ret i32 1
105486ed885SArthur Eubanks;
106486ed885SArthur Eubanks  %f = call i32 @llvm.fshl.i32(i32 1, i32 2, i32 undef)
107486ed885SArthur Eubanks  ret i32 %f
108486ed885SArthur Eubanks}
109486ed885SArthur Eubanks
110486ed885SArthur Eubanksdefine i32 @fshr_scalar_undef_shamt() {
111486ed885SArthur Eubanks; CHECK-LABEL: @fshr_scalar_undef_shamt(
112486ed885SArthur Eubanks; CHECK-NEXT:    ret i32 2
113486ed885SArthur Eubanks;
114486ed885SArthur Eubanks  %f = call i32 @llvm.fshr.i32(i32 1, i32 2, i32 undef)
115486ed885SArthur Eubanks  ret i32 %f
116486ed885SArthur Eubanks}
117486ed885SArthur Eubanks
118486ed885SArthur Eubanksdefine i32 @fshl_scalar_undef_ops() {
119486ed885SArthur Eubanks; CHECK-LABEL: @fshl_scalar_undef_ops(
120486ed885SArthur Eubanks; CHECK-NEXT:    ret i32 undef
121486ed885SArthur Eubanks;
122486ed885SArthur Eubanks  %f = call i32 @llvm.fshl.i32(i32 undef, i32 undef, i32 7)
123486ed885SArthur Eubanks  ret i32 %f
124486ed885SArthur Eubanks}
125486ed885SArthur Eubanks
126486ed885SArthur Eubanksdefine i32 @fshr_scalar_undef_ops() {
127486ed885SArthur Eubanks; CHECK-LABEL: @fshr_scalar_undef_ops(
128486ed885SArthur Eubanks; CHECK-NEXT:    ret i32 undef
129486ed885SArthur Eubanks;
130486ed885SArthur Eubanks  %f = call i32 @llvm.fshr.i32(i32 undef, i32 undef, i32 7)
131486ed885SArthur Eubanks  ret i32 %f
132486ed885SArthur Eubanks}
133486ed885SArthur Eubanks
134486ed885SArthur Eubanksdefine i32 @fshl_scalar_undef_op1_zero_shift() {
135486ed885SArthur Eubanks; CHECK-LABEL: @fshl_scalar_undef_op1_zero_shift(
136486ed885SArthur Eubanks; CHECK-NEXT:    ret i32 undef
137486ed885SArthur Eubanks;
138486ed885SArthur Eubanks  %f = call i32 @llvm.fshl.i32(i32 undef, i32 1, i32 0)
139486ed885SArthur Eubanks  ret i32 %f
140486ed885SArthur Eubanks}
141486ed885SArthur Eubanks
142486ed885SArthur Eubanksdefine i32 @fshl_scalar_undef_op2_zero_shift() {
143486ed885SArthur Eubanks; CHECK-LABEL: @fshl_scalar_undef_op2_zero_shift(
144486ed885SArthur Eubanks; CHECK-NEXT:    ret i32 1
145486ed885SArthur Eubanks;
146486ed885SArthur Eubanks  %f = call i32 @llvm.fshl.i32(i32 1, i32 undef, i32 32)
147486ed885SArthur Eubanks  ret i32 %f
148486ed885SArthur Eubanks}
149486ed885SArthur Eubanks
150486ed885SArthur Eubanksdefine i32 @fshr_scalar_undef_op1_zero_shift() {
151486ed885SArthur Eubanks; CHECK-LABEL: @fshr_scalar_undef_op1_zero_shift(
152486ed885SArthur Eubanks; CHECK-NEXT:    ret i32 1
153486ed885SArthur Eubanks;
154486ed885SArthur Eubanks  %f = call i32 @llvm.fshr.i32(i32 undef, i32 1, i32 64)
155486ed885SArthur Eubanks  ret i32 %f
156486ed885SArthur Eubanks}
157486ed885SArthur Eubanks
158486ed885SArthur Eubanksdefine i32 @fshr_scalar_undef_op2_zero_shift() {
159486ed885SArthur Eubanks; CHECK-LABEL: @fshr_scalar_undef_op2_zero_shift(
160486ed885SArthur Eubanks; CHECK-NEXT:    ret i32 undef
161486ed885SArthur Eubanks;
162486ed885SArthur Eubanks  %f = call i32 @llvm.fshr.i32(i32 1, i32 undef, i32 0)
163486ed885SArthur Eubanks  ret i32 %f
164486ed885SArthur Eubanks}
165486ed885SArthur Eubanks
166486ed885SArthur Eubanksdefine i32 @fshl_scalar_undef_op1_nonzero_shift() {
167486ed885SArthur Eubanks; CHECK-LABEL: @fshl_scalar_undef_op1_nonzero_shift(
168486ed885SArthur Eubanks; CHECK-NEXT:    ret i32 255
169486ed885SArthur Eubanks;
170486ed885SArthur Eubanks  %f = call i32 @llvm.fshl.i32(i32 undef, i32 -1, i32 8)
171486ed885SArthur Eubanks  ret i32 %f
172486ed885SArthur Eubanks}
173486ed885SArthur Eubanks
174486ed885SArthur Eubanksdefine i32 @fshl_scalar_undef_op2_nonzero_shift() {
175486ed885SArthur Eubanks; CHECK-LABEL: @fshl_scalar_undef_op2_nonzero_shift(
176486ed885SArthur Eubanks; CHECK-NEXT:    ret i32 -256
177486ed885SArthur Eubanks;
178486ed885SArthur Eubanks  %f = call i32 @llvm.fshl.i32(i32 -1, i32 undef, i32 8)
179486ed885SArthur Eubanks  ret i32 %f
180486ed885SArthur Eubanks}
181486ed885SArthur Eubanks
182486ed885SArthur Eubanksdefine i32 @fshr_scalar_undef_op1_nonzero_shift() {
183486ed885SArthur Eubanks; CHECK-LABEL: @fshr_scalar_undef_op1_nonzero_shift(
184486ed885SArthur Eubanks; CHECK-NEXT:    ret i32 16777215
185486ed885SArthur Eubanks;
186486ed885SArthur Eubanks  %f = call i32 @llvm.fshr.i32(i32 undef, i32 -1, i32 8)
187486ed885SArthur Eubanks  ret i32 %f
188486ed885SArthur Eubanks}
189486ed885SArthur Eubanks
190486ed885SArthur Eubanksdefine i32 @fshr_scalar_undef_op2_nonzero_shift() {
191486ed885SArthur Eubanks; CHECK-LABEL: @fshr_scalar_undef_op2_nonzero_shift(
192486ed885SArthur Eubanks; CHECK-NEXT:    ret i32 -16777216
193486ed885SArthur Eubanks;
194486ed885SArthur Eubanks  %f = call i32 @llvm.fshr.i32(i32 -1, i32 undef, i32 8)
195486ed885SArthur Eubanks  ret i32 %f
196486ed885SArthur Eubanks}
197486ed885SArthur Eubanks
198486ed885SArthur Eubanks; Undef/Undef/Undef; 1/2/Undef; Undef/Undef/3; Undef/1/0
199486ed885SArthur Eubanksdefine <4 x i8> @fshl_vector_mix1() {
200486ed885SArthur Eubanks; CHECK-LABEL: @fshl_vector_mix1(
201486ed885SArthur Eubanks; CHECK-NEXT:    ret <4 x i8> <i8 undef, i8 1, i8 undef, i8 undef>
202486ed885SArthur Eubanks;
203486ed885SArthur Eubanks  %f = call <4 x i8> @llvm.fshl.v4i8(<4 x i8> <i8 undef, i8 1, i8 undef, i8 undef>, <4 x i8> <i8 undef, i8 2, i8 undef, i8 1>, <4 x i8> <i8 undef, i8 undef, i8 3, i8 0>)
204486ed885SArthur Eubanks  ret <4 x i8> %f
205486ed885SArthur Eubanks}
206486ed885SArthur Eubanks
207486ed885SArthur Eubanks; 1/Undef/8; Undef/-1/2; -1/Undef/2; 7/8/4
208486ed885SArthur Eubanksdefine <4 x i8> @fshl_vector_mix2() {
209486ed885SArthur Eubanks; CHECK-LABEL: @fshl_vector_mix2(
210486ed885SArthur Eubanks; CHECK-NEXT:    ret <4 x i8> <i8 1, i8 3, i8 -4, i8 112>
211486ed885SArthur Eubanks;
212486ed885SArthur Eubanks  %f = call <4 x i8> @llvm.fshl.v4i8(<4 x i8> <i8 1, i8 undef, i8 -1, i8 7>, <4 x i8> <i8 undef, i8 -1, i8 undef, i8 8>, <4 x i8> <i8 8, i8 2, i8 2, i8 4>)
213486ed885SArthur Eubanks  ret <4 x i8> %f
214486ed885SArthur Eubanks}
215486ed885SArthur Eubanks
216486ed885SArthur Eubanks; Undef/Undef/Undef; 1/2/Undef; Undef/Undef/3; Undef/1/0
217486ed885SArthur Eubanksdefine <4 x i8> @fshr_vector_mix1() {
218486ed885SArthur Eubanks; CHECK-LABEL: @fshr_vector_mix1(
219486ed885SArthur Eubanks; CHECK-NEXT:    ret <4 x i8> <i8 undef, i8 2, i8 undef, i8 1>
220486ed885SArthur Eubanks;
221486ed885SArthur Eubanks  %f = call <4 x i8> @llvm.fshr.v4i8(<4 x i8> <i8 undef, i8 1, i8 undef, i8 undef>, <4 x i8> <i8 undef, i8 2, i8 undef, i8 1>, <4 x i8> <i8 undef, i8 undef, i8 3, i8 0>)
222486ed885SArthur Eubanks  ret <4 x i8> %f
223486ed885SArthur Eubanks}
224486ed885SArthur Eubanks
225486ed885SArthur Eubanks; 1/Undef/8; Undef/-1/2; -1/Undef/2; 7/8/4
226486ed885SArthur Eubanksdefine <4 x i8> @fshr_vector_mix2() {
227486ed885SArthur Eubanks; CHECK-LABEL: @fshr_vector_mix2(
228486ed885SArthur Eubanks; CHECK-NEXT:    ret <4 x i8> <i8 undef, i8 63, i8 -64, i8 112>
229486ed885SArthur Eubanks;
230486ed885SArthur Eubanks  %f = call <4 x i8> @llvm.fshr.v4i8(<4 x i8> <i8 1, i8 undef, i8 -1, i8 7>, <4 x i8> <i8 undef, i8 -1, i8 undef, i8 8>, <4 x i8> <i8 8, i8 2, i8 2, i8 4>)
231486ed885SArthur Eubanks  ret <4 x i8> %f
232486ed885SArthur Eubanks}
233