257 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=avr -mcpu=avrtiny | FileCheck %s3 4; NOTE: Both %a(i8) and %b(i8) cost two registers.5define i8 @foo0(i8 %a, i8 %b) {6; CHECK-LABEL: foo0:7; CHECK: ; %bb.0:8; CHECK-NEXT: sub r24, r229; CHECK-NEXT: ret10 %c = sub i8 %a, %b11 ret i8 %c12}13 14; NOTE: Both %a(i16) and %b(i16) cost two registers.15define i16 @foo1(i16 %a, i16 %b) {16; CHECK-LABEL: foo1:17; CHECK: ; %bb.0:18; CHECK-NEXT: sub r24, r2219; CHECK-NEXT: sbc r25, r2320; CHECK-NEXT: ret21 %c = sub i16 %a, %b22 ret i16 %c23}24 25; NOTE: %a(i16), %b(i16) and %c(i16) each costs two registers.26define i16 @foo2(i16 %a, i16 %b, i16 %c) {27; CHECK-LABEL: foo2:28; CHECK: ; %bb.0:29; CHECK-NEXT: sub r22, r2430; CHECK-NEXT: sbc r23, r2531; CHECK-NEXT: add r22, r2032; CHECK-NEXT: adc r23, r2133; CHECK-NEXT: mov r24, r2234; CHECK-NEXT: mov r25, r2335; CHECK-NEXT: ret36 %d = sub i16 %a, %b37 %e = sub i16 %c, %d38 ret i16 %e39}40 41; NOTE: %a(i16), %b(i16) and %c(i16) each costs two registers,42; while %d(i16) is passed via the stack.43define i16 @foo3(i16 %a, i16 %b, i16 %c, i16 %d) {44; CHECK-LABEL: foo3:45; CHECK: ; %bb.0:46; CHECK-NEXT: push r2847; CHECK-NEXT: push r2948; CHECK-NEXT: in r28, 6149; CHECK-NEXT: in r29, 6250; CHECK-NEXT: in r16, 6351; CHECK-NEXT: subi r28, 25152; CHECK-NEXT: sbci r29, 25553; CHECK-NEXT: ld r30, Y+54; CHECK-NEXT: ld r31, Y+55; CHECK-NEXT: subi r28, 256; CHECK-NEXT: sbci r29, 057; CHECK-NEXT: subi r28, 558; CHECK-NEXT: sbci r29, 059; CHECK-NEXT: out 63, r1660; CHECK-NEXT: sub r20, r3061; CHECK-NEXT: sbc r21, r3162; CHECK-NEXT: sub r24, r2263; CHECK-NEXT: sbc r25, r2364; CHECK-NEXT: add r24, r2065; CHECK-NEXT: adc r25, r2166; CHECK-NEXT: pop r2967; CHECK-NEXT: pop r2868; CHECK-NEXT: ret69 %e = sub i16 %a, %b70 %g = sub i16 %c, %d71 %h = add i16 %e, %g72 ret i16 %h73}74 75; NOTE: %a(i32) costs four registers, while %b(i32) is passed via the stack.76define i32 @foo4(i32 %a, i32 %b) {77; CHECK-LABEL: foo4:78; CHECK: ; %bb.0:79; CHECK-NEXT: push r2880; CHECK-NEXT: push r2981; CHECK-NEXT: in r28, 6182; CHECK-NEXT: in r29, 6283; CHECK-NEXT: in r16, 6384; CHECK-NEXT: subi r28, 25185; CHECK-NEXT: sbci r29, 25586; CHECK-NEXT: ld r20, Y+87; CHECK-NEXT: ld r21, Y+88; CHECK-NEXT: subi r28, 289; CHECK-NEXT: sbci r29, 090; CHECK-NEXT: subi r28, 591; CHECK-NEXT: sbci r29, 092; CHECK-NEXT: out 63, r1693; CHECK-NEXT: in r16, 6394; CHECK-NEXT: subi r28, 24995; CHECK-NEXT: sbci r29, 25596; CHECK-NEXT: ld r30, Y+97; CHECK-NEXT: ld r31, Y+98; CHECK-NEXT: subi r28, 299; CHECK-NEXT: sbci r29, 0100; CHECK-NEXT: subi r28, 7101; CHECK-NEXT: sbci r29, 0102; CHECK-NEXT: out 63, r16103; CHECK-NEXT: sub r20, r22104; CHECK-NEXT: sbc r21, r23105; CHECK-NEXT: sbc r30, r24106; CHECK-NEXT: sbc r31, r25107; CHECK-NEXT: mov r22, r20108; CHECK-NEXT: mov r23, r21109; CHECK-NEXT: mov r24, r30110; CHECK-NEXT: mov r25, r31111; CHECK-NEXT: pop r29112; CHECK-NEXT: pop r28113; CHECK-NEXT: ret114 %c = sub i32 %b, %a115 ret i32 %c116}117 118; NOTE: %0 costs six registers, while %1 is passed via the stack.119define i8 @foo5([5 x i8] %0, i8 %1) {120; CHECK-LABEL: foo5:121; CHECK: ; %bb.0:122; CHECK-NEXT: push r28123; CHECK-NEXT: push r29124; CHECK-NEXT: in r28, 61125; CHECK-NEXT: in r29, 62126; CHECK-NEXT: mov r26, r28127; CHECK-NEXT: mov r27, r29128; CHECK-NEXT: subi r26, 251129; CHECK-NEXT: sbci r27, 255130; CHECK-NEXT: ld r24, X131; CHECK-NEXT: add r24, r20132; CHECK-NEXT: pop r29133; CHECK-NEXT: pop r28134; CHECK-NEXT: ret135 %3 = extractvalue [5 x i8] %0, 0136 %4 = add i8 %3, %1137 ret i8 %4138}139 140; NOTE: %0 costs two registers and %1 costs four registers.141define i8 @foo6([2 x i8] %0, [4 x i8] %1) {142; CHECK-LABEL: foo6:143; CHECK: ; %bb.0:144; CHECK-NEXT: add r24, r20145; CHECK-NEXT: ret146 %3 = extractvalue [2 x i8] %0, 0147 %4 = extractvalue [4 x i8] %1, 0148 %5 = add i8 %3, %4149 ret i8 %5150}151 152; NOTE: %0 cost four registers, while %1 is passed via the stack,153; though there are two vacant registers.154define i8 @foo7([3 x i8] %0, [3 x i8] %1) {155; CHECK-LABEL: foo7:156; CHECK: ; %bb.0:157; CHECK-NEXT: push r28158; CHECK-NEXT: push r29159; CHECK-NEXT: in r28, 61160; CHECK-NEXT: in r29, 62161; CHECK-NEXT: mov r26, r28162; CHECK-NEXT: mov r27, r29163; CHECK-NEXT: subi r26, 251164; CHECK-NEXT: sbci r27, 255165; CHECK-NEXT: ld r24, X166; CHECK-NEXT: add r24, r22167; CHECK-NEXT: pop r29168; CHECK-NEXT: pop r28169; CHECK-NEXT: ret170 %3 = extractvalue [3 x i8] %0, 0171 %4 = extractvalue [3 x i8] %1, 0172 %5 = add i8 %3, %4173 ret i8 %5174}175 176; NOTE: %0 costs four registers, and %1 costs two registers, while %2 is177; passed via the stack, though there is one vacant register.178define i8 @foo8([3 x i8] %0, i8 %1, i8 %2) {179; CHECK-LABEL: foo8:180; CHECK: ; %bb.0:181; CHECK-NEXT: push r28182; CHECK-NEXT: push r29183; CHECK-NEXT: in r28, 61184; CHECK-NEXT: in r29, 62185; CHECK-NEXT: add r22, r20186; CHECK-NEXT: mov r26, r28187; CHECK-NEXT: mov r27, r29188; CHECK-NEXT: subi r26, 251189; CHECK-NEXT: sbci r27, 255190; CHECK-NEXT: ld r24, X191; CHECK-NEXT: sub r24, r22192; CHECK-NEXT: pop r29193; CHECK-NEXT: pop r28194; CHECK-NEXT: ret195 %4 = extractvalue [3 x i8] %0, 0196 %5 = add i8 %4, %1197 %6 = sub i8 %2, %5198 ret i8 %6199}200 201; NOTE: %0 is passed via registers, though there are 6 vacant registers.202define i8 @foo9([7 x i8] %0) {203; CHECK-LABEL: foo9:204; CHECK: ; %bb.0:205; CHECK-NEXT: push r28206; CHECK-NEXT: push r29207; CHECK-NEXT: in r28, 61208; CHECK-NEXT: in r29, 62209; CHECK-NEXT: mov r26, r28210; CHECK-NEXT: mov r27, r29211; CHECK-NEXT: subi r26, 250212; CHECK-NEXT: sbci r27, 255213; CHECK-NEXT: ld r25, X214; CHECK-NEXT: mov r26, r28215; CHECK-NEXT: mov r27, r29216; CHECK-NEXT: subi r26, 251217; CHECK-NEXT: sbci r27, 255218; CHECK-NEXT: ld r24, X219; CHECK-NEXT: add r24, r25220; CHECK-NEXT: pop r29221; CHECK-NEXT: pop r28222; CHECK-NEXT: ret223 %2 = extractvalue [7 x i8] %0, 0224 %3 = extractvalue [7 x i8] %0, 1225 %4 = add i8 %2, %3226 ret i8 %4227}228 229; NOTE: %0 costs six registers, while %1 and %2 are passed via the stack.230define i8 @fooa([6 x i8] %0, i8 %1, i8 %2) {231; CHECK-LABEL: fooa:232; CHECK: ; %bb.0:233; CHECK-NEXT: push r28234; CHECK-NEXT: push r29235; CHECK-NEXT: in r28, 61236; CHECK-NEXT: in r29, 62237; CHECK-NEXT: mov r26, r28238; CHECK-NEXT: mov r27, r29239; CHECK-NEXT: subi r26, 251240; CHECK-NEXT: sbci r27, 255241; CHECK-NEXT: ld r25, X242; CHECK-NEXT: mov r26, r28243; CHECK-NEXT: mov r27, r29244; CHECK-NEXT: subi r26, 250245; CHECK-NEXT: sbci r27, 255246; CHECK-NEXT: ld r24, X247; CHECK-NEXT: sub r24, r25248; CHECK-NEXT: sub r24, r20249; CHECK-NEXT: pop r29250; CHECK-NEXT: pop r28251; CHECK-NEXT: ret252 %4 = extractvalue [6 x i8] %0, 0253 %5 = sub i8 %2, %1254 %6 = sub i8 %5, %4255 ret i8 %6256}257