Mercurial > hg > CbC > CbC_llvm
comparison test/Transforms/InstCombine/ffs-1.ll @ 121:803732b1fca8
LLVM 5.0
author | kono |
---|---|
date | Fri, 27 Oct 2017 17:07:41 +0900 |
parents | 7d135dc70f03 |
children |
comparison
equal
deleted
inserted
replaced
120:1172e4bd9c6f | 121:803732b1fca8 |
---|---|
1 ; Test that the ffs* library call simplifier works correctly. | 1 ; Test that the ffs* library call simplifier works correctly. |
2 ; | 2 ; |
3 ; RUN: opt < %s -instcombine -S | FileCheck %s | 3 ; RUN: opt < %s -instcombine -S | FileCheck %s --check-prefix=ALL --check-prefix=GENERIC |
4 ; RUN: opt < %s -mtriple i386-pc-linux -instcombine -S | FileCheck %s -check-prefix=CHECK-FFS | 4 ; RUN: opt < %s -instcombine -mtriple i386-pc-linux -S | FileCheck %s --check-prefix=ALL --check-prefix=TARGET |
5 ; RUN: opt -instcombine -mtriple=arm64-apple-ios9.0 -S %s | FileCheck --check-prefix=CHECK-FFS %s | 5 ; RUN: opt < %s -instcombine -mtriple=arm64-apple-ios9.0 -S | FileCheck %s --check-prefix=ALL --check-prefix=TARGET |
6 ; RUN: opt -instcombine -mtriple=arm64-apple-tvos9.0 -S %s | FileCheck --check-prefix=CHECK-FFS %s | 6 ; RUN: opt < %s -instcombine -mtriple=arm64-apple-tvos9.0 -S | FileCheck %s --check-prefix=ALL --check-prefix=TARGET |
7 ; RUN: opt -instcombine -mtriple=thumbv7k-apple-watchos2.0 -S %s | FileCheck --check-prefix=CHECK-FFS %s | 7 ; RUN: opt < %s -instcombine -mtriple=thumbv7k-apple-watchos2.0 -S | FileCheck %s --check-prefix=ALL --check-prefix=TARGET |
8 ; RUN: opt -instcombine -mtriple=x86_64-apple-macosx10.11 -S %s | FileCheck --check-prefix=CHECK-FFS %s | 8 ; RUN: opt < %s -instcombine -mtriple=x86_64-apple-macosx10.11 -S | FileCheck %s --check-prefix=ALL --check-prefix=TARGET |
9 ; RUN: opt -instcombine -mtriple=x86_64-freebsd-gnu -S %s | FileCheck --check-prefix=CHECK-FFS %s | 9 ; RUN: opt < %s -instcombine -mtriple=x86_64-freebsd-gnu -S | FileCheck %s --check-prefix=ALL --check-prefix=TARGET |
10 | 10 |
11 declare i32 @ffs(i32) | 11 declare i32 @ffs(i32) |
12 declare i32 @ffsl(i32) | 12 declare i32 @ffsl(i32) |
13 declare i32 @ffsll(i64) | 13 declare i32 @ffsll(i64) |
14 | 14 |
15 ; Check ffs(0) -> 0. | 15 ; Check ffs(0) -> 0. |
16 | 16 |
17 define i32 @test_simplify1() { | 17 define i32 @test_simplify1() { |
18 ; CHECK-LABEL: @test_simplify1( | 18 ; ALL-LABEL: @test_simplify1( |
19 ; ALL-NEXT: ret i32 0 | |
20 ; | |
19 %ret = call i32 @ffs(i32 0) | 21 %ret = call i32 @ffs(i32 0) |
20 ret i32 %ret | 22 ret i32 %ret |
21 ; CHECK-NEXT: ret i32 0 | |
22 } | 23 } |
23 | 24 |
24 define i32 @test_simplify2() { | 25 define i32 @test_simplify2() { |
25 ; CHECK-FFS-LABEL: @test_simplify2( | 26 ; GENERIC-LABEL: @test_simplify2( |
27 ; GENERIC-NEXT: [[RET:%.*]] = call i32 @ffsl(i32 0) | |
28 ; GENERIC-NEXT: ret i32 [[RET]] | |
29 ; | |
30 ; TARGET-LABEL: @test_simplify2( | |
31 ; TARGET-NEXT: ret i32 0 | |
32 ; | |
26 %ret = call i32 @ffsl(i32 0) | 33 %ret = call i32 @ffsl(i32 0) |
27 ret i32 %ret | 34 ret i32 %ret |
28 ; CHECK-FFS-NEXT: ret i32 0 | |
29 } | 35 } |
30 | 36 |
31 define i32 @test_simplify3() { | 37 define i32 @test_simplify3() { |
32 ; CHECK-FFS-LABEL: @test_simplify3( | 38 ; GENERIC-LABEL: @test_simplify3( |
39 ; GENERIC-NEXT: [[RET:%.*]] = call i32 @ffsll(i64 0) | |
40 ; GENERIC-NEXT: ret i32 [[RET]] | |
41 ; | |
42 ; TARGET-LABEL: @test_simplify3( | |
43 ; TARGET-NEXT: ret i32 0 | |
44 ; | |
33 %ret = call i32 @ffsll(i64 0) | 45 %ret = call i32 @ffsll(i64 0) |
34 ret i32 %ret | 46 ret i32 %ret |
35 ; CHECK-FFS-NEXT: ret i32 0 | |
36 } | 47 } |
37 | 48 |
38 ; Check ffs(c) -> cttz(c) + 1, where 'c' is a constant. | 49 ; Check ffs(c) -> cttz(c) + 1, where 'c' is a constant. |
39 | 50 |
40 define i32 @test_simplify4() { | 51 define i32 @test_simplify4() { |
41 ; CHECK-LABEL: @test_simplify4( | 52 ; ALL-LABEL: @test_simplify4( |
53 ; ALL-NEXT: ret i32 1 | |
54 ; | |
42 %ret = call i32 @ffs(i32 1) | 55 %ret = call i32 @ffs(i32 1) |
43 ret i32 %ret | 56 ret i32 %ret |
44 ; CHECK-NEXT: ret i32 1 | |
45 } | 57 } |
46 | 58 |
47 define i32 @test_simplify5() { | 59 define i32 @test_simplify5() { |
48 ; CHECK-LABEL: @test_simplify5( | 60 ; ALL-LABEL: @test_simplify5( |
61 ; ALL-NEXT: ret i32 12 | |
62 ; | |
49 %ret = call i32 @ffs(i32 2048) | 63 %ret = call i32 @ffs(i32 2048) |
50 ret i32 %ret | 64 ret i32 %ret |
51 ; CHECK-NEXT: ret i32 12 | |
52 } | 65 } |
53 | 66 |
54 define i32 @test_simplify6() { | 67 define i32 @test_simplify6() { |
55 ; CHECK-LABEL: @test_simplify6( | 68 ; ALL-LABEL: @test_simplify6( |
69 ; ALL-NEXT: ret i32 17 | |
70 ; | |
56 %ret = call i32 @ffs(i32 65536) | 71 %ret = call i32 @ffs(i32 65536) |
57 ret i32 %ret | 72 ret i32 %ret |
58 ; CHECK-NEXT: ret i32 17 | |
59 } | 73 } |
60 | 74 |
61 define i32 @test_simplify7() { | 75 define i32 @test_simplify7() { |
62 ; CHECK-FFS-LABEL: @test_simplify7( | 76 ; GENERIC-LABEL: @test_simplify7( |
77 ; GENERIC-NEXT: [[RET:%.*]] = call i32 @ffsl(i32 65536) | |
78 ; GENERIC-NEXT: ret i32 [[RET]] | |
79 ; | |
80 ; TARGET-LABEL: @test_simplify7( | |
81 ; TARGET-NEXT: ret i32 17 | |
82 ; | |
63 %ret = call i32 @ffsl(i32 65536) | 83 %ret = call i32 @ffsl(i32 65536) |
64 ret i32 %ret | 84 ret i32 %ret |
65 ; CHECK-FFS-NEXT: ret i32 17 | |
66 } | 85 } |
67 | 86 |
68 define i32 @test_simplify8() { | 87 define i32 @test_simplify8() { |
69 ; CHECK-FFS-LABEL: @test_simplify8( | 88 ; GENERIC-LABEL: @test_simplify8( |
89 ; GENERIC-NEXT: [[RET:%.*]] = call i32 @ffsll(i64 1024) | |
90 ; GENERIC-NEXT: ret i32 [[RET]] | |
91 ; | |
92 ; TARGET-LABEL: @test_simplify8( | |
93 ; TARGET-NEXT: ret i32 11 | |
94 ; | |
70 %ret = call i32 @ffsll(i64 1024) | 95 %ret = call i32 @ffsll(i64 1024) |
71 ret i32 %ret | 96 ret i32 %ret |
72 ; CHECK-FFS-NEXT: ret i32 11 | |
73 } | 97 } |
74 | 98 |
75 define i32 @test_simplify9() { | 99 define i32 @test_simplify9() { |
76 ; CHECK-FFS-LABEL: @test_simplify9( | 100 ; GENERIC-LABEL: @test_simplify9( |
101 ; GENERIC-NEXT: [[RET:%.*]] = call i32 @ffsll(i64 65536) | |
102 ; GENERIC-NEXT: ret i32 [[RET]] | |
103 ; | |
104 ; TARGET-LABEL: @test_simplify9( | |
105 ; TARGET-NEXT: ret i32 17 | |
106 ; | |
77 %ret = call i32 @ffsll(i64 65536) | 107 %ret = call i32 @ffsll(i64 65536) |
78 ret i32 %ret | 108 ret i32 %ret |
79 ; CHECK-FFS-NEXT: ret i32 17 | |
80 } | 109 } |
81 | 110 |
82 define i32 @test_simplify10() { | 111 define i32 @test_simplify10() { |
83 ; CHECK-FFS-LABEL: @test_simplify10( | 112 ; GENERIC-LABEL: @test_simplify10( |
113 ; GENERIC-NEXT: [[RET:%.*]] = call i32 @ffsll(i64 17179869184) | |
114 ; GENERIC-NEXT: ret i32 [[RET]] | |
115 ; | |
116 ; TARGET-LABEL: @test_simplify10( | |
117 ; TARGET-NEXT: ret i32 35 | |
118 ; | |
84 %ret = call i32 @ffsll(i64 17179869184) | 119 %ret = call i32 @ffsll(i64 17179869184) |
85 ret i32 %ret | 120 ret i32 %ret |
86 ; CHECK-FFS-NEXT: ret i32 35 | |
87 } | 121 } |
88 | 122 |
89 define i32 @test_simplify11() { | 123 define i32 @test_simplify11() { |
90 ; CHECK-FFS-LABEL: @test_simplify11( | 124 ; GENERIC-LABEL: @test_simplify11( |
125 ; GENERIC-NEXT: [[RET:%.*]] = call i32 @ffsll(i64 281474976710656) | |
126 ; GENERIC-NEXT: ret i32 [[RET]] | |
127 ; | |
128 ; TARGET-LABEL: @test_simplify11( | |
129 ; TARGET-NEXT: ret i32 49 | |
130 ; | |
91 %ret = call i32 @ffsll(i64 281474976710656) | 131 %ret = call i32 @ffsll(i64 281474976710656) |
92 ret i32 %ret | 132 ret i32 %ret |
93 ; CHECK-FFS-NEXT: ret i32 49 | |
94 } | 133 } |
95 | 134 |
96 define i32 @test_simplify12() { | 135 define i32 @test_simplify12() { |
97 ; CHECK-FFS-LABEL: @test_simplify12( | 136 ; GENERIC-LABEL: @test_simplify12( |
137 ; GENERIC-NEXT: [[RET:%.*]] = call i32 @ffsll(i64 1152921504606846976) | |
138 ; GENERIC-NEXT: ret i32 [[RET]] | |
139 ; | |
140 ; TARGET-LABEL: @test_simplify12( | |
141 ; TARGET-NEXT: ret i32 61 | |
142 ; | |
98 %ret = call i32 @ffsll(i64 1152921504606846976) | 143 %ret = call i32 @ffsll(i64 1152921504606846976) |
99 ret i32 %ret | 144 ret i32 %ret |
100 ; CHECK-FFS-NEXT: ret i32 61 | |
101 } | 145 } |
102 | 146 |
103 ; Check ffs(x) -> x != 0 ? (i32)llvm.cttz(x) + 1 : 0. | 147 ; Check ffs(x) -> x != 0 ? (i32)llvm.cttz(x) + 1 : 0. |
104 | 148 |
105 define i32 @test_simplify13(i32 %x) { | 149 define i32 @test_simplify13(i32 %x) { |
106 ; CHECK-LABEL: @test_simplify13( | 150 ; ALL-LABEL: @test_simplify13( |
151 ; ALL-NEXT: [[CTTZ:%.*]] = call i32 @llvm.cttz.i32(i32 %x, i1 true), !range !0 | |
152 ; ALL-NEXT: [[TMP1:%.*]] = add nuw nsw i32 [[CTTZ]], 1 | |
153 ; ALL-NEXT: [[TMP2:%.*]] = icmp eq i32 %x, 0 | |
154 ; ALL-NEXT: [[TMP3:%.*]] = select i1 [[TMP2]], i32 0, i32 [[TMP1]] | |
155 ; ALL-NEXT: ret i32 [[TMP3]] | |
156 ; | |
107 %ret = call i32 @ffs(i32 %x) | 157 %ret = call i32 @ffs(i32 %x) |
108 ; CHECK-NEXT: [[CTTZ:%[a-z0-9]+]] = call i32 @llvm.cttz.i32(i32 %x, i1 true) | |
109 ; CHECK-NEXT: [[INC:%[a-z0-9]+]] = add nuw nsw i32 [[CTTZ]], 1 | |
110 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 %x, 0 | |
111 ; CHECK-NEXT: [[RET:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[INC]], i32 0 | |
112 ret i32 %ret | 158 ret i32 %ret |
113 ; CHECK-NEXT: ret i32 [[RET]] | |
114 } | 159 } |
115 | 160 |
116 define i32 @test_simplify14(i32 %x) { | 161 define i32 @test_simplify14(i32 %x) { |
117 ; CHECK-FFS-LABEL: @test_simplify14( | 162 ; GENERIC-LABEL: @test_simplify14( |
163 ; GENERIC-NEXT: [[RET:%.*]] = call i32 @ffsl(i32 %x) | |
164 ; GENERIC-NEXT: ret i32 [[RET]] | |
165 ; | |
166 ; TARGET-LABEL: @test_simplify14( | |
167 ; TARGET-NEXT: [[CTTZ:%.*]] = call i32 @llvm.cttz.i32(i32 %x, i1 true), !range !0 | |
168 ; TARGET-NEXT: [[TMP1:%.*]] = add nuw nsw i32 [[CTTZ]], 1 | |
169 ; TARGET-NEXT: [[TMP2:%.*]] = icmp eq i32 %x, 0 | |
170 ; TARGET-NEXT: [[TMP3:%.*]] = select i1 [[TMP2]], i32 0, i32 [[TMP1]] | |
171 ; TARGET-NEXT: ret i32 [[TMP3]] | |
172 ; | |
118 %ret = call i32 @ffsl(i32 %x) | 173 %ret = call i32 @ffsl(i32 %x) |
119 ; CHECK-FFS-NEXT: [[CTTZ:%[a-z0-9]+]] = call i32 @llvm.cttz.i32(i32 %x, i1 true) | |
120 ; CHECK-FFS-NEXT: [[INC:%[a-z0-9]+]] = add nuw nsw i32 [[CTTZ]], 1 | |
121 ; CHECK-FFS-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 %x, 0 | |
122 ; CHECK-FFS-NEXT: [[RET:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[INC]], i32 0 | |
123 ret i32 %ret | 174 ret i32 %ret |
124 ; CHECK-FFS-NEXT: ret i32 [[RET]] | |
125 } | 175 } |
126 | 176 |
127 define i32 @test_simplify15(i64 %x) { | 177 define i32 @test_simplify15(i64 %x) { |
128 ; CHECK-FFS-LABEL: @test_simplify15( | 178 ; GENERIC-LABEL: @test_simplify15( |
179 ; GENERIC-NEXT: [[RET:%.*]] = call i32 @ffsll(i64 %x) | |
180 ; GENERIC-NEXT: ret i32 [[RET]] | |
181 ; | |
182 ; TARGET-LABEL: @test_simplify15( | |
183 ; TARGET-NEXT: [[CTTZ:%.*]] = call i64 @llvm.cttz.i64(i64 %x, i1 true), !range !1 | |
184 ; TARGET-NEXT: [[TMP1:%.*]] = trunc i64 [[CTTZ]] to i32 | |
185 ; TARGET-NEXT: [[TMP2:%.*]] = add nuw nsw i32 [[TMP1]], 1 | |
186 ; TARGET-NEXT: [[TMP3:%.*]] = icmp eq i64 %x, 0 | |
187 ; TARGET-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i32 0, i32 [[TMP2]] | |
188 ; TARGET-NEXT: ret i32 [[TMP4]] | |
189 ; | |
129 %ret = call i32 @ffsll(i64 %x) | 190 %ret = call i32 @ffsll(i64 %x) |
130 ; CHECK-FFS-NEXT: [[CTTZ:%[a-z0-9]+]] = call i64 @llvm.cttz.i64(i64 %x, i1 true) | |
131 ; CHECK-FFS-NEXT: [[INC:%[a-z0-9]+]] = add nuw nsw i64 [[CTTZ]], 1 | |
132 ; CHECK-FFS-NEXT: [[TRUNC:%[a-z0-9]+]] = trunc i64 [[INC]] to i32 | |
133 ; CHECK-FFS-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i64 %x, 0 | |
134 ; CHECK-FFS-NEXT: [[RET:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[TRUNC]], i32 0 | |
135 ret i32 %ret | 191 ret i32 %ret |
136 ; CHECK-FFS-NEXT: ret i32 [[RET]] | |
137 } | 192 } |
193 |