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