1; RUN: opt < %s -instsimplify -S | FileCheck %s
2
3define i32 @identity_bitreverse_i32(i32 %p) {
4; CHECK-LABEL: @identity_bitreverse_i32(
5; CHECK-NEXT: ret i32 %p
6  %a = call i32 @llvm.bitreverse.i32(i32 %p)
7  %b = call i32 @llvm.bitreverse.i32(i32 %a)
8  ret i32 %b
9}
10
11; CHECK-LABEL: @identity_bitreverse_v2i32(
12; CHECK-NEXT: ret <2 x i32> %p
13define <2 x i32> @identity_bitreverse_v2i32(<2 x i32> %p) {
14  %a = call <2 x i32> @llvm.bitreverse.v2i32(<2 x i32> %p)
15  %b = call <2 x i32> @llvm.bitreverse.v2i32(<2 x i32> %a)
16  ret <2 x i32> %b
17}
18
19; CHECK-LABEL: @reverse_0_i32(
20; CHECK-NEXT: ret i32 0
21define i32 @reverse_0_i32() {
22  %x = call i32 @llvm.bitreverse.i32(i32 0)
23  ret i32 %x
24}
25
26; CHECK-LABEL: @reverse_1_i32(
27; CHECK-NEXT: ret i32 -2147483648
28define i32 @reverse_1_i32() {
29  %x = call i32 @llvm.bitreverse.i32(i32 1)
30  ret i32 %x
31}
32
33; CHECK-LABEL: @reverse_neg1_i32(
34; CHECK-NEXT: ret i32 -1
35define i32 @reverse_neg1_i32() {
36  %x = call i32 @llvm.bitreverse.i32(i32 -1)
37  ret i32 %x
38}
39
40; CHECK-LABEL: @reverse_undef_i32(
41; CHECK-NEXT: ret i32 undef
42define i32 @reverse_undef_i32() {
43  %x = call i32 @llvm.bitreverse.i32(i32 undef)
44  ret i32 %x
45}
46
47; CHECK-LABEL: @reverse_false_i1(
48; CHECK-NEXT: ret i1 false
49define i1 @reverse_false_i1() {
50  %x = call i1 @llvm.bitreverse.i1(i1 false)
51  ret i1 %x
52}
53
54; CHECK-LABEL: @reverse_true_i1(
55; CHECK-NEXT: ret i1 true
56define i1 @reverse_true_i1() {
57  %x = call i1 @llvm.bitreverse.i1(i1 true)
58  ret i1 %x
59}
60
61; CHECK-LABEL: @reverse_undef_i1(
62; CHECK-NEXT: ret i1 undef
63define i1 @reverse_undef_i1() {
64  %x = call i1 @llvm.bitreverse.i1(i1 undef)
65  ret i1 %x
66}
67
68; CHECK-LABEL: @reverse_false_v2i1(
69; CHECK-NEXT: ret <2 x i1> zeroinitializer
70define <2 x i1> @reverse_false_v2i1() {
71  %x = call <2  x i1> @llvm.bitreverse.v2i1(<2 x i1> zeroinitializer)
72  ret <2 x i1> %x
73}
74
75; CHECK-LABEL: @reverse_true_v2i1(
76; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
77define <2 x i1> @reverse_true_v2i1() {
78  %x = call <2 x i1> @llvm.bitreverse.v2i1(<2 x i1> <i1 true, i1 true>)
79  ret <2 x i1> %x
80}
81
82; CHECK-LABEL: @bitreverse_920_1234_v2i32(
83; CHECK-NEXT: ret <2 x i32> <i32 432013312, i32 1260388352>
84define <2 x i32> @bitreverse_920_1234_v2i32() {
85  %x = call <2 x i32> @llvm.bitreverse.v2i32(<2 x i32> <i32 920, i32 1234>)
86  ret <2 x i32> %x
87}
88
89; CHECK-LABEL: @reverse_100_i3(
90; CHECK-NEXT: ret i3 1
91define i3 @reverse_100_i3() {
92  %x = call i3 @llvm.bitreverse.i3(i3 100)
93  ret i3 %x
94}
95
96; CHECK-LABEL: @reverse_6_3_v2i3(
97; CHECK-NEXT: ret <2 x i3> <i3 3, i3 -2>
98define <2 x i3> @reverse_6_3_v2i3() {
99  %x = call <2  x i3> @llvm.bitreverse.v2i3(<2 x i3> <i3 6, i3 3>)
100  ret <2 x i3> %x
101}
102
103declare i1 @llvm.bitreverse.i1(i1) readnone
104declare <2 x i1> @llvm.bitreverse.v2i1(<2 x i1>) readnone
105
106declare i3 @llvm.bitreverse.i3(i3) readnone
107declare <2 x i3> @llvm.bitreverse.v2i3(<2 x i3>) readnone
108
109declare i32 @llvm.bitreverse.i32(i32) readnone
110declare <2 x i32> @llvm.bitreverse.v2i32(<2 x i32>) readnone
111