xref: /llvm-project/llvm/test/Transforms/InstCombine/ffs-i16.ll (revision b8f3024a315074e0f880542c33cb89681eebc5a3)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2;
3; Test that the ffs library call simplifier works correctly even for
4; targets with 16-bit int.
5;
6; RUN: opt < %s -mtriple=avr-linux -passes=instcombine -S | FileCheck %s --check-prefix=AVR
7; RUN: opt < %s -mtriple=msp430-linux -passes=instcombine -S | FileCheck %s --check-prefix=MSP430
8; REQUIRES: avr-registered-target,msp430-registered-target
9
10
11declare i16 @ffs(i16)
12
13declare void @sink(i16)
14
15
16define void @fold_ffs(i16 %x) {
17; AVR-LABEL: @fold_ffs(
18; AVR-NEXT:    call addrspace(1) void @sink(i16 0)
19; AVR-NEXT:    call addrspace(1) void @sink(i16 1)
20; AVR-NEXT:    [[CTTZ:%.*]] = call range(i16 0, 17) addrspace(1) i16 @llvm.cttz.i16(i16 [[X:%.*]], i1 true)
21; AVR-NEXT:    [[TMP1:%.*]] = add nuw nsw i16 [[CTTZ]], 1
22; AVR-NEXT:    [[DOTNOT:%.*]] = icmp eq i16 [[X]], 0
23; AVR-NEXT:    [[NX:%.*]] = select i1 [[DOTNOT]], i16 0, i16 [[TMP1]]
24; AVR-NEXT:    call addrspace(1) void @sink(i16 [[NX]])
25; AVR-NEXT:    ret void
26;
27; MSP430-LABEL: @fold_ffs(
28; MSP430-NEXT:    call void @sink(i16 0)
29; MSP430-NEXT:    call void @sink(i16 1)
30; MSP430-NEXT:    [[CTTZ:%.*]] = call range(i16 0, 17) i16 @llvm.cttz.i16(i16 [[X:%.*]], i1 true)
31; MSP430-NEXT:    [[TMP1:%.*]] = add nuw nsw i16 [[CTTZ]], 1
32; MSP430-NEXT:    [[DOTNOT:%.*]] = icmp eq i16 [[X]], 0
33; MSP430-NEXT:    [[NX:%.*]] = select i1 [[DOTNOT]], i16 0, i16 [[TMP1]]
34; MSP430-NEXT:    call void @sink(i16 [[NX]])
35; MSP430-NEXT:    ret void
36;
37  %n0 = call i16 @ffs(i16 0)
38  call void @sink(i16 %n0)
39
40  %n1 = call i16 @ffs(i16 1)
41  call void @sink(i16 %n1)
42
43  %nx = call i16 @ffs(i16 %x)
44  call void @sink(i16 %nx)
45
46  ret void
47}
48