85 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2;3; RUN: opt < %s -mtriple=avr-freebsd -passes=instcombine -S | FileCheck %s --check-prefix=AVR4; RUN: opt < %s -mtriple=msp430-linux -passes=instcombine -S | FileCheck %s --check-prefix=MSP4305; REQUIRES: avr-registered-target,msp430-registered-target6;7; Verify that the puts to putchar transformation works correctly even for8; 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 result24; 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 i1641; 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 void44;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 i1659; MSP430-NEXT: [[PUTCHAR12:%.*]] = call i16 @putchar(i16 [[TMP1]])60; MSP430-NEXT: [[PUTCHAR13:%.*]] = call i16 @putchar(i16 [[C16:%.*]])61; MSP430-NEXT: ret void62;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-extended80; 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 void84}85