blob: bf87e6a3110042cdc8db4e1627fac7c47379f853 [file] [log] [blame]
Davide Italiano85ad36b2016-12-15 23:45:11 +00001; RUN: opt < %s -instcombine -S | FileCheck %s
2
3target triple = "x86_64-unknown-freebsd11.0"
4
Davide Italiano85ad36b2016-12-15 23:45:11 +00005define i32 @myfls() {
Sanjay Patel029fc772017-08-04 19:29:32 +00006; CHECK-LABEL: @myfls(
7; CHECK-NEXT: ret i32 6
8;
Davide Italiano85ad36b2016-12-15 23:45:11 +00009 %call = call i32 @fls(i32 42)
10 ret i32 %call
11}
12
Davide Italiano85ad36b2016-12-15 23:45:11 +000013define i32 @myflsl() {
Sanjay Patel029fc772017-08-04 19:29:32 +000014; CHECK-LABEL: @myflsl(
15; CHECK-NEXT: ret i32 6
16;
Davide Italiano85ad36b2016-12-15 23:45:11 +000017 %patatino = call i32 @flsl(i64 42)
18 ret i32 %patatino
19}
20
Davide Italiano85ad36b2016-12-15 23:45:11 +000021define i32 @myflsll() {
Sanjay Patel029fc772017-08-04 19:29:32 +000022; CHECK-LABEL: @myflsll(
23; CHECK-NEXT: ret i32 6
24;
Davide Italiano85ad36b2016-12-15 23:45:11 +000025 %whatever = call i32 @flsll(i64 42)
26 ret i32 %whatever
27}
28
29; Lower to llvm.ctlz() if the argument is not a constant
Davide Italiano85ad36b2016-12-15 23:45:11 +000030
31define i32 @flsnotconst(i64 %z) {
Sanjay Patel029fc772017-08-04 19:29:32 +000032; CHECK-LABEL: @flsnotconst(
33; CHECK-NEXT: [[CTLZ:%.*]] = call i64 @llvm.ctlz.i64(i64 %z, i1 false), !range !0
Sanjay Patele12d7342017-08-04 22:30:34 +000034; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[CTLZ]] to i32
35; CHECK-NEXT: [[TMP2:%.*]] = sub nsw i32 64, [[TMP1]]
Sanjay Patel029fc772017-08-04 19:29:32 +000036; CHECK-NEXT: ret i32 [[TMP2]]
37;
Davide Italiano85ad36b2016-12-15 23:45:11 +000038 %goo = call i32 @flsl(i64 %z)
39 ret i32 %goo
40}
41
Davide Italiano67e979e2016-12-15 23:48:07 +000042; Make sure we lower fls(0) to 0 and not to `undef`.
Sanjay Patel029fc772017-08-04 19:29:32 +000043
Davide Italiano67e979e2016-12-15 23:48:07 +000044define i32 @flszero() {
Sanjay Patel029fc772017-08-04 19:29:32 +000045; CHECK-LABEL: @flszero(
46; CHECK-NEXT: ret i32 0
47;
Davide Italiano67e979e2016-12-15 23:48:07 +000048 %zero = call i32 @fls(i32 0)
49 ret i32 %zero
50}
51
Davide Italiano85ad36b2016-12-15 23:45:11 +000052declare i32 @fls(i32)
53declare i32 @flsl(i64)
54declare i32 @flsll(i64)