• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: opt < %s -instcombine -S | FileCheck %s
2
3target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
4target triple = "x86_64-apple-macosx10.10.0"
5
6define zeroext i8 @f_u8(i8 zeroext %a) {
7; CHECK-LABEL: @f_u8
8; CHECK-NEXT: %[[A:.*]] = call i8 @llvm.bitreverse.i8(i8 %a)
9; CHECK-NEXT: ret i8 %[[A]]
10  %1 = shl i8 %a, 7
11  %2 = shl i8 %a, 5
12  %3 = and i8 %2, 64
13  %4 = shl i8 %a, 3
14  %5 = and i8 %4, 32
15  %6 = shl i8 %a, 1
16  %7 = and i8 %6, 16
17  %8 = lshr i8 %a, 1
18  %9 = and i8 %8, 8
19  %10 = lshr i8 %a, 3
20  %11 = and i8 %10, 4
21  %12 = lshr i8 %a, 5
22  %13 = and i8 %12, 2
23  %14 = lshr i8 %a, 7
24  %15 = or i8 %14, %1
25  %16 = or i8 %15, %3
26  %17 = or i8 %16, %5
27  %18 = or i8 %17, %7
28  %19 = or i8 %18, %9
29  %20 = or i8 %19, %11
30  %21 = or i8 %20, %13
31  ret i8 %21
32}
33
34; The ANDs with 32 and 64 have been swapped here, so the sequence does not
35; completely match a bitreverse.
36define zeroext i8 @f_u8_fail(i8 zeroext %a) {
37; CHECK-LABEL: @f_u8_fail
38; CHECK-NOT: call
39; CHECK: ret i8
40  %1 = shl i8 %a, 7
41  %2 = shl i8 %a, 5
42  %3 = and i8 %2, 32
43  %4 = shl i8 %a, 3
44  %5 = and i8 %4, 64
45  %6 = shl i8 %a, 1
46  %7 = and i8 %6, 16
47  %8 = lshr i8 %a, 1
48  %9 = and i8 %8, 8
49  %10 = lshr i8 %a, 3
50  %11 = and i8 %10, 4
51  %12 = lshr i8 %a, 5
52  %13 = and i8 %12, 2
53  %14 = lshr i8 %a, 7
54  %15 = or i8 %14, %1
55  %16 = or i8 %15, %3
56  %17 = or i8 %16, %5
57  %18 = or i8 %17, %7
58  %19 = or i8 %18, %9
59  %20 = or i8 %19, %11
60  %21 = or i8 %20, %13
61  ret i8 %21
62}
63
64define zeroext i16 @f_u16(i16 zeroext %a) {
65; CHECK-LABEL: @f_u16
66; CHECK-NEXT: %[[A:.*]] = call i16 @llvm.bitreverse.i16(i16 %a)
67; CHECK-NEXT: ret i16 %[[A]]
68  %1 = shl i16 %a, 15
69  %2 = shl i16 %a, 13
70  %3 = and i16 %2, 16384
71  %4 = shl i16 %a, 11
72  %5 = and i16 %4, 8192
73  %6 = shl i16 %a, 9
74  %7 = and i16 %6, 4096
75  %8 = shl i16 %a, 7
76  %9 = and i16 %8, 2048
77  %10 = shl i16 %a, 5
78  %11 = and i16 %10, 1024
79  %12 = shl i16 %a, 3
80  %13 = and i16 %12, 512
81  %14 = shl i16 %a, 1
82  %15 = and i16 %14, 256
83  %16 = lshr i16 %a, 1
84  %17 = and i16 %16, 128
85  %18 = lshr i16 %a, 3
86  %19 = and i16 %18, 64
87  %20 = lshr i16 %a, 5
88  %21 = and i16 %20, 32
89  %22 = lshr i16 %a, 7
90  %23 = and i16 %22, 16
91  %24 = lshr i16 %a, 9
92  %25 = and i16 %24, 8
93  %26 = lshr i16 %a, 11
94  %27 = and i16 %26, 4
95  %28 = lshr i16 %a, 13
96  %29 = and i16 %28, 2
97  %30 = lshr i16 %a, 15
98  %31 = or i16 %30, %1
99  %32 = or i16 %31, %3
100  %33 = or i16 %32, %5
101  %34 = or i16 %33, %7
102  %35 = or i16 %34, %9
103  %36 = or i16 %35, %11
104  %37 = or i16 %36, %13
105  %38 = or i16 %37, %15
106  %39 = or i16 %38, %17
107  %40 = or i16 %39, %19
108  %41 = or i16 %40, %21
109  %42 = or i16 %41, %23
110  %43 = or i16 %42, %25
111  %44 = or i16 %43, %27
112  %45 = or i16 %44, %29
113  ret i16 %45
114}