xref: /llvm-project/llvm/test/Transforms/InstCombine/printf-i16.ll (revision 1e029cf53bc9fb1894824363634323f0ed51c5a8)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2;
3; RUN: opt < %s -mtriple=avr-freebsd -passes=instcombine -S | FileCheck %s --check-prefix=AVR
4; RUN: opt < %s -mtriple=msp430-linux -passes=instcombine -S | FileCheck %s --check-prefix=MSP430
5; REQUIRES: avr-registered-target,msp430-registered-target
6;
7; Verify that the puts to putchar transformation works correctly even for
8; targets with 16-bit int.
9
10declare i16 @putchar(i16)
11declare i16 @puts(ptr)
12
13@s1 = constant [2 x i8] c"\01\00"
14@s7f = constant [2 x i8] c"\7f\00"
15@s80 = constant [2 x i8] c"\80\00"
16@sff = constant [2 x i8] c"\ff\00"
17
18@pcnt_c = constant [3 x i8] c"%c\00"
19@pcnt_s = constant [3 x i8] c"%s\00"
20
21declare i16 @printf(ptr, ...)
22
23; Verfify that the three printf to putchar transformations all result
24; in the same output for calls with equivalent arguments.
25
26define void @xform_printf(i8 %c8, i16 %c16) {
27; AVR-LABEL: @xform_printf(
28; AVR-NEXT:    [[PUTCHAR:%.*]] = call addrspace(1) i16 @putchar(i16 1)
29; AVR-NEXT:    [[PUTCHAR1:%.*]] = call addrspace(1) i16 @putchar(i16 1)
30; AVR-NEXT:    [[PUTCHAR2:%.*]] = call addrspace(1) i16 @putchar(i16 1)
31; AVR-NEXT:    [[PUTCHAR3:%.*]] = call addrspace(1) i16 @putchar(i16 127)
32; AVR-NEXT:    [[PUTCHAR4:%.*]] = call addrspace(1) i16 @putchar(i16 127)
33; AVR-NEXT:    [[PUTCHAR5:%.*]] = call addrspace(1) i16 @putchar(i16 127)
34; AVR-NEXT:    [[PUTCHAR6:%.*]] = call addrspace(1) i16 @putchar(i16 128)
35; AVR-NEXT:    [[PUTCHAR7:%.*]] = call addrspace(1) i16 @putchar(i16 128)
36; AVR-NEXT:    [[PUTCHAR8:%.*]] = call addrspace(1) i16 @putchar(i16 128)
37; AVR-NEXT:    [[PUTCHAR9:%.*]] = call addrspace(1) i16 @putchar(i16 255)
38; AVR-NEXT:    [[PUTCHAR10:%.*]] = call addrspace(1) i16 @putchar(i16 255)
39; AVR-NEXT:    [[PUTCHAR11:%.*]] = call addrspace(1) i16 @putchar(i16 255)
40; AVR-NEXT:    [[TMP1:%.*]] = zext i8 [[C8:%.*]] to i16
41; AVR-NEXT:    [[PUTCHAR12:%.*]] = call addrspace(1) i16 @putchar(i16 [[TMP1]])
42; AVR-NEXT:    [[PUTCHAR13:%.*]] = call addrspace(1) i16 @putchar(i16 [[C16:%.*]])
43; AVR-NEXT:    ret void
44;
45; MSP430-LABEL: @xform_printf(
46; MSP430-NEXT:    [[PUTCHAR:%.*]] = call i16 @putchar(i16 1)
47; MSP430-NEXT:    [[PUTCHAR1:%.*]] = call i16 @putchar(i16 1)
48; MSP430-NEXT:    [[PUTCHAR2:%.*]] = call i16 @putchar(i16 1)
49; MSP430-NEXT:    [[PUTCHAR3:%.*]] = call i16 @putchar(i16 127)
50; MSP430-NEXT:    [[PUTCHAR4:%.*]] = call i16 @putchar(i16 127)
51; MSP430-NEXT:    [[PUTCHAR5:%.*]] = call i16 @putchar(i16 127)
52; MSP430-NEXT:    [[PUTCHAR6:%.*]] = call i16 @putchar(i16 128)
53; MSP430-NEXT:    [[PUTCHAR7:%.*]] = call i16 @putchar(i16 128)
54; MSP430-NEXT:    [[PUTCHAR8:%.*]] = call i16 @putchar(i16 128)
55; MSP430-NEXT:    [[PUTCHAR9:%.*]] = call i16 @putchar(i16 255)
56; MSP430-NEXT:    [[PUTCHAR10:%.*]] = call i16 @putchar(i16 255)
57; MSP430-NEXT:    [[PUTCHAR11:%.*]] = call i16 @putchar(i16 255)
58; MSP430-NEXT:    [[TMP1:%.*]] = zext i8 [[C8:%.*]] to i16
59; MSP430-NEXT:    [[PUTCHAR12:%.*]] = call i16 @putchar(i16 [[TMP1]])
60; MSP430-NEXT:    [[PUTCHAR13:%.*]] = call i16 @putchar(i16 [[C16:%.*]])
61; MSP430-NEXT:    ret void
62;
63  call i16 (ptr, ...) @printf(ptr @s1)
64  call i16 (ptr, ...) @printf(ptr @pcnt_c, i16 1)
65  call i16 (ptr, ...) @printf(ptr @pcnt_s, ptr @s1)
66
67  call i16 (ptr, ...) @printf(ptr @s7f)
68  call i16 (ptr, ...) @printf(ptr @pcnt_c, i16 127)
69  call i16 (ptr, ...) @printf(ptr @pcnt_s, ptr @s7f)
70
71  call i16 (ptr, ...) @printf(ptr @s80)
72  call i16 (ptr, ...) @printf(ptr @pcnt_c, i16 128)
73  call i16 (ptr, ...) @printf(ptr @pcnt_s, ptr @s80)
74
75  call i16 (ptr, ...) @printf(ptr @sff)
76  call i16 (ptr, ...) @printf(ptr @pcnt_c, i16 255)
77  call i16 (ptr, ...) @printf(ptr @pcnt_s, ptr @sff)
78
79; The i8 argument to printf can be either zero-extended or sign-extended
80; when passed to putchar which then converts it to unsigned char.
81  call i16 (ptr, ...) @printf(ptr @pcnt_c, i8 %c8)
82  call i16 (ptr, ...) @printf(ptr @pcnt_c, i16 %c16)
83  ret void
84}
85