• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32"
2
3; RUN: opt < %s -instcombine -S | FileCheck %s
4
5; CHECK-LABEL: @test1
6; CHECK: call i32 @llvm.bswap.i32(i32 %i)
7define i32 @test1(i32 %i) {
8  %tmp1 = lshr i32 %i, 24
9  %tmp3 = lshr i32 %i, 8
10  %tmp4 = and i32 %tmp3, 65280
11  %tmp5 = or i32 %tmp1, %tmp4
12  %tmp7 = shl i32 %i, 8
13  %tmp8 = and i32 %tmp7, 16711680
14  %tmp9 = or i32 %tmp5, %tmp8
15  %tmp11 = shl i32 %i, 24
16  %tmp12 = or i32 %tmp9, %tmp11
17  ret i32 %tmp12
18}
19
20; CHECK-LABEL: @test2
21; CHECK: call i32 @llvm.bswap.i32(i32 %arg)
22define i32 @test2(i32 %arg) {
23  %tmp2 = shl i32 %arg, 24
24  %tmp4 = shl i32 %arg, 8
25  %tmp5 = and i32 %tmp4, 16711680
26  %tmp6 = or i32 %tmp2, %tmp5
27  %tmp8 = lshr i32 %arg, 8
28  %tmp9 = and i32 %tmp8, 65280
29  %tmp10 = or i32 %tmp6, %tmp9
30  %tmp12 = lshr i32 %arg, 24
31  %tmp14 = or i32 %tmp10, %tmp12
32  ret i32 %tmp14
33}
34
35; CHECK-LABEL: @test3
36; CHECK: call i16 @llvm.bswap.i16(i16 %s)
37define i16 @test3(i16 %s) {
38  %tmp2 = lshr i16 %s, 8
39  %tmp4 = shl i16 %s, 8
40  %tmp5 = or i16 %tmp2, %tmp4
41  ret i16 %tmp5
42}
43
44; CHECK-LABEL: @test4
45; CHECK: call i16 @llvm.bswap.i16(i16 %s)
46define i16 @test4(i16 %s) {
47  %tmp2 = lshr i16 %s, 8
48  %tmp4 = shl i16 %s, 8
49  %tmp5 = or i16 %tmp4, %tmp2
50  ret i16 %tmp5
51}
52
53; CHECK-LABEL: @test5
54; CHECK: call i16 @llvm.bswap.i16(i16 %a)
55define i16 @test5(i16 %a) {
56  %tmp = zext i16 %a to i32
57  %tmp1 = and i32 %tmp, 65280
58  %tmp2 = ashr i32 %tmp1, 8
59  %tmp2.upgrd.1 = trunc i32 %tmp2 to i16
60  %tmp4 = and i32 %tmp, 255
61  %tmp5 = shl i32 %tmp4, 8
62  %tmp5.upgrd.2 = trunc i32 %tmp5 to i16
63  %tmp.upgrd.3 = or i16 %tmp2.upgrd.1, %tmp5.upgrd.2
64  %tmp6 = bitcast i16 %tmp.upgrd.3 to i16
65  %tmp6.upgrd.4 = zext i16 %tmp6 to i32
66  %retval = trunc i32 %tmp6.upgrd.4 to i16
67  ret i16 %retval
68}
69
70; PR2842
71; CHECK-LABEL: @test6
72; CHECK: call i32 @llvm.bswap.i32(i32 %x)
73define i32 @test6(i32 %x) nounwind readnone {
74  %tmp = shl i32 %x, 16
75  %x.mask = and i32 %x, 65280
76  %tmp1 = lshr i32 %x, 16
77  %tmp2 = and i32 %tmp1, 255
78  %tmp3 = or i32 %x.mask, %tmp
79  %tmp4 = or i32 %tmp3, %tmp2
80  %tmp5 = shl i32 %tmp4, 8
81  %tmp6 = lshr i32 %x, 24
82  %tmp7 = or i32 %tmp5, %tmp6
83  ret i32 %tmp7
84}
85
86; PR23863
87; CHECK-LABEL: @test7
88; CHECK: call i32 @llvm.bswap.i32(i32 %x)
89define i32 @test7(i32 %x) {
90  %shl = shl i32 %x, 16
91  %shr = lshr i32 %x, 16
92  %or = or i32 %shl, %shr
93  %and2 = shl i32 %or, 8
94  %shl3 = and i32 %and2, -16711936
95  %and4 = lshr i32 %or, 8
96  %shr5 = and i32 %and4, 16711935
97  %or6 = or i32 %shl3, %shr5
98  ret i32 %or6
99}
100
101; CHECK-LABEL: @test8
102; CHECK: call i16 @llvm.bswap.i16(i16 %a)
103define i16 @test8(i16 %a) {
104entry:
105  %conv = zext i16 %a to i32
106  %shr = lshr i16 %a, 8
107  %shl = shl i32 %conv, 8
108  %conv1 = zext i16 %shr to i32
109  %or = or i32 %conv1, %shl
110  %conv2 = trunc i32 %or to i16
111  ret i16 %conv2
112}
113
114; CHECK-LABEL: @test9
115; CHECK: call i16 @llvm.bswap.i16(i16 %a)
116define i16 @test9(i16 %a) {
117entry:
118  %conv = zext i16 %a to i32
119  %shr = lshr i32 %conv, 8
120  %shl = shl i32 %conv, 8
121  %or = or i32 %shr, %shl
122  %conv2 = trunc i32 %or to i16
123  ret i16 %conv2
124}
125
126; CHECK-LABEL: @test10
127; CHECK: trunc i32 %a to i16
128; CHECK: call i16 @llvm.bswap.i16(i16 %trunc)
129define i16 @test10(i32 %a) {
130  %shr1 = lshr i32 %a, 8
131  %and1 = and i32 %shr1, 255
132  %and2 = shl i32 %a, 8
133  %shl1 = and i32 %and2, 65280
134  %or = or i32 %and1, %shl1
135  %conv = trunc i32 %or to i16
136  ret i16 %conv
137}
138