xref: /llvm-project/llvm/test/Transforms/InstCombine/isdigit-i16.ll (revision 1e029cf53bc9fb1894824363634323f0ed51c5a8)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; Test that the isdigit library call simplifier works correctly even for
3; targets with 16-bit int.
4;
5; RUN: opt < %s -mtriple=avr-linux -passes=instcombine -S | FileCheck %s --check-prefix=AVR
6; RUN: opt < %s -mtriple=msp430-freebsd -passes=instcombine -S | FileCheck %s  --check-prefix=MSP430
7; REQUIRES: avr-registered-target,msp430-registered-target
8
9declare i16 @isdigit(i16)
10
11declare void @sink(i16)
12
13define void @fold_isdigit(i16 %c) {
14; AVR-LABEL: @fold_isdigit(
15; AVR-NEXT:    call addrspace(1) void @sink(i16 0)
16; AVR-NEXT:    call addrspace(1) void @sink(i16 0)
17; AVR-NEXT:    call addrspace(1) void @sink(i16 0)
18; AVR-NEXT:    call addrspace(1) void @sink(i16 1)
19; AVR-NEXT:    call addrspace(1) void @sink(i16 1)
20; AVR-NEXT:    call addrspace(1) void @sink(i16 1)
21; AVR-NEXT:    call addrspace(1) void @sink(i16 0)
22; AVR-NEXT:    call addrspace(1) void @sink(i16 0)
23; AVR-NEXT:    call addrspace(1) void @sink(i16 0)
24; AVR-NEXT:    call addrspace(1) void @sink(i16 0)
25; AVR-NEXT:    call addrspace(1) void @sink(i16 0)
26; AVR-NEXT:    call addrspace(1) void @sink(i16 0)
27; AVR-NEXT:    [[ISDIGITTMP:%.*]] = add i16 [[C:%.*]], -48
28; AVR-NEXT:    [[ISDIGIT:%.*]] = icmp ult i16 [[ISDIGITTMP]], 10
29; AVR-NEXT:    [[IC:%.*]] = zext i1 [[ISDIGIT]] to i16
30; AVR-NEXT:    call addrspace(1) void @sink(i16 [[IC]])
31; AVR-NEXT:    ret void
32;
33; MSP430-LABEL: @fold_isdigit(
34; MSP430-NEXT:    call void @sink(i16 0)
35; MSP430-NEXT:    call void @sink(i16 0)
36; MSP430-NEXT:    call void @sink(i16 0)
37; MSP430-NEXT:    call void @sink(i16 1)
38; MSP430-NEXT:    call void @sink(i16 1)
39; MSP430-NEXT:    call void @sink(i16 1)
40; MSP430-NEXT:    call void @sink(i16 0)
41; MSP430-NEXT:    call void @sink(i16 0)
42; MSP430-NEXT:    call void @sink(i16 0)
43; MSP430-NEXT:    call void @sink(i16 0)
44; MSP430-NEXT:    call void @sink(i16 0)
45; MSP430-NEXT:    call void @sink(i16 0)
46; MSP430-NEXT:    [[ISDIGITTMP:%.*]] = add i16 [[C:%.*]], -48
47; MSP430-NEXT:    [[ISDIGIT:%.*]] = icmp ult i16 [[ISDIGITTMP]], 10
48; MSP430-NEXT:    [[IC:%.*]] = zext i1 [[ISDIGIT]] to i16
49; MSP430-NEXT:    call void @sink(i16 [[IC]])
50; MSP430-NEXT:    ret void
51;
52  %i0 = call i16 @isdigit(i16 0)
53  call void @sink(i16 %i0)
54
55  %i1 = call i16 @isdigit(i16 1)
56  call void @sink(i16 %i1)
57
58  ; Fold isdigit('/') to 0.
59  %i47 = call i16 @isdigit(i16 47)
60  call void @sink(i16 %i47)
61
62; Fold isdigit('0') to 1.
63  %i48 = call i16 @isdigit(i16 48)
64  call void @sink(i16 %i48)
65
66  ; Fold isdigit('1') to 1.
67  %i49 = call i16 @isdigit(i16 49)
68  call void @sink(i16 %i49)
69
70  ; Fold isdigit('9') to 1.
71  %i57 = call i16 @isdigit(i16 57)
72  call void @sink(i16 %i57)
73
74  ; Fold isdigit(':') to 0.
75  %i58 = call i16 @isdigit(i16 58)
76  call void @sink(i16 %i58)
77
78  %i127 = call i16 @isdigit(i16 127)
79  call void @sink(i16 %i127)
80
81  %i128 = call i16 @isdigit(i16 128)
82  call void @sink(i16 %i128)
83
84  %i255 = call i16 @isdigit(i16 255)
85  call void @sink(i16 %i255)
86
87  ; Fold isdigit(256) to 0.  The argument is required to be representable
88  ; in unsigned char but it's a common mistake to call the function with
89  ; other arguments and it's arguably safer to fold such calls than to
90  ; let the library call return an arbitrary value or crash.
91  %i256 = call i16 @isdigit(i16 256)
92  call void @sink(i16 %i256)
93
94  ; Same as above.
95  %imax = call i16 @isdigit(i16 32767)
96  call void @sink(i16 %imax)
97
98  %ic = call i16 @isdigit(i16 %c)
99  call void @sink(i16 %ic)
100
101  ret void
102}
103