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