1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 4target triple = "x86_64-unknown-freebsd11.0" 5 6define i32 @myfls() { 7; CHECK-LABEL: @myfls( 8; CHECK-NEXT: ret i32 6 9; 10 %call = call i32 @fls(i32 42) 11 ret i32 %call 12} 13 14define i32 @myflsl() { 15; CHECK-LABEL: @myflsl( 16; CHECK-NEXT: ret i32 6 17; 18 %patatino = call i32 @flsl(i64 42) 19 ret i32 %patatino 20} 21 22define i32 @myflsll() { 23; CHECK-LABEL: @myflsll( 24; CHECK-NEXT: ret i32 6 25; 26 %whatever = call i32 @flsll(i64 42) 27 ret i32 %whatever 28} 29 30; Lower to llvm.ctlz() if the argument is not a constant 31 32define i32 @flsnotconst(i64 %z) { 33; CHECK-LABEL: @flsnotconst( 34; CHECK-NEXT: [[CTLZ:%.*]] = call range(i64 0, 65) i64 @llvm.ctlz.i64(i64 [[Z:%.*]], i1 false) 35; CHECK-NEXT: [[TMP1:%.*]] = trunc nuw nsw i64 [[CTLZ]] to i32 36; CHECK-NEXT: [[GOO:%.*]] = sub nsw i32 64, [[TMP1]] 37; CHECK-NEXT: ret i32 [[GOO]] 38; 39 %goo = call i32 @flsl(i64 %z) 40 ret i32 %goo 41} 42 43; Make sure we lower fls(0) to 0 and not to `undef`. 44 45define i32 @flszero() { 46; CHECK-LABEL: @flszero( 47; CHECK-NEXT: ret i32 0 48; 49 %zero = call i32 @fls(i32 0) 50 ret i32 %zero 51} 52 53declare i32 @fls(i32) 54declare i32 @flsl(i64) 55declare i32 @flsll(i64) 56