487 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=avr -mattr=+movw -mattr=+elpm -mattr=+elpmx -mattr=+lpm -mattr=+lpmx -verify-machineinstrs \3; RUN: | FileCheck %s4; RUN: llc < %s -mtriple=avr -mattr=+movw -mattr=+elpm -mattr=-elpmx -mattr=+lpm -mattr=-lpmx -verify-machineinstrs \5; RUN: | FileCheck --check-prefix=NOX %s6 7@arr0 = addrspace(1) constant [4 x i16] [i16 123, i16 24, i16 56, i16 37], align 18@arr1 = addrspace(2) constant [4 x i16] [i16 123, i16 34, i16 46, i16 27], align 19@arr2 = addrspace(3) constant [4 x i16] [i16 123, i16 23, i16 45, i16 17], align 110 11define i16 @foo0(i16 %a, i16 %b) {12; CHECK-LABEL: foo0:13; CHECK: ; %bb.0: ; %entry14; CHECK-NEXT: lsl r2215; CHECK-NEXT: rol r2316; CHECK-NEXT: subi r22, lo8(-(arr0))17; CHECK-NEXT: sbci r23, hi8(-(arr0))18; CHECK-NEXT: movw r30, r2219; CHECK-NEXT: lpm r18, Z+20; CHECK-NEXT: lpm r19, Z21; CHECK-NEXT: lsl r2422; CHECK-NEXT: rol r2523; CHECK-NEXT: subi r24, lo8(-(arr0))24; CHECK-NEXT: sbci r25, hi8(-(arr0))25; CHECK-NEXT: movw r30, r2426; CHECK-NEXT: lpm r24, Z+27; CHECK-NEXT: lpm r25, Z28; CHECK-NEXT: sub r24, r1829; CHECK-NEXT: sbc r25, r1930; CHECK-NEXT: ret31;32; NOX-LABEL: foo0:33; NOX: ; %bb.0: ; %entry34; NOX-NEXT: lsl r2235; NOX-NEXT: rol r2336; NOX-NEXT: subi r22, lo8(-(arr0))37; NOX-NEXT: sbci r23, hi8(-(arr0))38; NOX-NEXT: movw r30, r2239; NOX-NEXT: lpm40; NOX-NEXT: mov r18, r041; NOX-NEXT: adiw r30, 142; NOX-NEXT: lpm43; NOX-NEXT: mov r19, r044; NOX-NEXT: lsl r2445; NOX-NEXT: rol r2546; NOX-NEXT: subi r24, lo8(-(arr0))47; NOX-NEXT: sbci r25, hi8(-(arr0))48; NOX-NEXT: movw r30, r2449; NOX-NEXT: lpm50; NOX-NEXT: mov r24, r051; NOX-NEXT: adiw r30, 152; NOX-NEXT: lpm53; NOX-NEXT: mov r25, r054; NOX-NEXT: sub r24, r1855; NOX-NEXT: sbc r25, r1956; NOX-NEXT: ret57entry:58 %arrayidx = getelementptr inbounds [4 x i16], ptr addrspace(1) @arr0, i16 0, i16 %a59 %0 = load i16, ptr addrspace(1) %arrayidx, align 160 %arrayidx1 = getelementptr inbounds [4 x i16], ptr addrspace(1) @arr0, i16 0, i16 %b61 %1 = load i16, ptr addrspace(1) %arrayidx1, align 162 %sub = sub nsw i16 %0, %163 ret i16 %sub64}65 66define i16 @foo1(i16 %a, i16 %b) {67; CHECK-LABEL: foo1:68; CHECK: ; %bb.0: ; %entry69; CHECK-NEXT: lsl r2270; CHECK-NEXT: rol r2371; CHECK-NEXT: subi r22, lo8(-(arr1))72; CHECK-NEXT: sbci r23, hi8(-(arr1))73; CHECK-NEXT: movw r30, r2274; CHECK-NEXT: ldi r18, 175; CHECK-NEXT: out 59, r1876; CHECK-NEXT: elpm r20, Z+77; CHECK-NEXT: elpm r21, Z78; CHECK-NEXT: lsl r2479; CHECK-NEXT: rol r2580; CHECK-NEXT: subi r24, lo8(-(arr0))81; CHECK-NEXT: sbci r25, hi8(-(arr0))82; CHECK-NEXT: movw r30, r2483; CHECK-NEXT: lpm r24, Z+84; CHECK-NEXT: lpm r25, Z85; CHECK-NEXT: sub r24, r2086; CHECK-NEXT: sbc r25, r2187; CHECK-NEXT: ret88;89; NOX-LABEL: foo1:90; NOX: ; %bb.0: ; %entry91; NOX-NEXT: lsl r2292; NOX-NEXT: rol r2393; NOX-NEXT: subi r22, lo8(-(arr1))94; NOX-NEXT: sbci r23, hi8(-(arr1))95; NOX-NEXT: movw r30, r2296; NOX-NEXT: ldi r18, 197; NOX-NEXT: out 59, r1898; NOX-NEXT: elpm99; NOX-NEXT: mov r20, r0100; NOX-NEXT: adiw r30, 1101; NOX-NEXT: elpm102; NOX-NEXT: mov r21, r0103; NOX-NEXT: lsl r24104; NOX-NEXT: rol r25105; NOX-NEXT: subi r24, lo8(-(arr0))106; NOX-NEXT: sbci r25, hi8(-(arr0))107; NOX-NEXT: movw r30, r24108; NOX-NEXT: lpm109; NOX-NEXT: mov r24, r0110; NOX-NEXT: adiw r30, 1111; NOX-NEXT: lpm112; NOX-NEXT: mov r25, r0113; NOX-NEXT: sub r24, r20114; NOX-NEXT: sbc r25, r21115; NOX-NEXT: ret116entry:117 %arrayidx = getelementptr inbounds [4 x i16], ptr addrspace(1) @arr0, i16 0, i16 %a118 %0 = load i16, ptr addrspace(1) %arrayidx, align 1119 %arrayidx1 = getelementptr inbounds [4 x i16], ptr addrspace(2) @arr1, i16 0, i16 %b120 %1 = load i16, ptr addrspace(2) %arrayidx1, align 1121 %sub = sub nsw i16 %0, %1122 ret i16 %sub123}124 125define i16 @foo2(i16 %a, i16 %b) {126; CHECK-LABEL: foo2:127; CHECK: ; %bb.0: ; %entry128; CHECK-NEXT: lsl r24129; CHECK-NEXT: rol r25130; CHECK-NEXT: subi r24, lo8(-(arr2))131; CHECK-NEXT: sbci r25, hi8(-(arr2))132; CHECK-NEXT: movw r30, r24133; CHECK-NEXT: ldi r18, 2134; CHECK-NEXT: out 59, r18135; CHECK-NEXT: elpm r24, Z+136; CHECK-NEXT: elpm r25, Z137; CHECK-NEXT: lsl r22138; CHECK-NEXT: rol r23139; CHECK-NEXT: subi r22, lo8(-(arr0))140; CHECK-NEXT: sbci r23, hi8(-(arr0))141; CHECK-NEXT: movw r30, r22142; CHECK-NEXT: lpm r18, Z+143; CHECK-NEXT: lpm r19, Z144; CHECK-NEXT: sub r24, r18145; CHECK-NEXT: sbc r25, r19146; CHECK-NEXT: ret147;148; NOX-LABEL: foo2:149; NOX: ; %bb.0: ; %entry150; NOX-NEXT: lsl r24151; NOX-NEXT: rol r25152; NOX-NEXT: subi r24, lo8(-(arr2))153; NOX-NEXT: sbci r25, hi8(-(arr2))154; NOX-NEXT: movw r30, r24155; NOX-NEXT: ldi r18, 2156; NOX-NEXT: out 59, r18157; NOX-NEXT: elpm158; NOX-NEXT: mov r24, r0159; NOX-NEXT: adiw r30, 1160; NOX-NEXT: elpm161; NOX-NEXT: mov r25, r0162; NOX-NEXT: lsl r22163; NOX-NEXT: rol r23164; NOX-NEXT: subi r22, lo8(-(arr0))165; NOX-NEXT: sbci r23, hi8(-(arr0))166; NOX-NEXT: movw r30, r22167; NOX-NEXT: lpm168; NOX-NEXT: mov r18, r0169; NOX-NEXT: adiw r30, 1170; NOX-NEXT: lpm171; NOX-NEXT: mov r19, r0172; NOX-NEXT: sub r24, r18173; NOX-NEXT: sbc r25, r19174; NOX-NEXT: ret175entry:176 %arrayidx = getelementptr inbounds [4 x i16], ptr addrspace(3) @arr2, i16 0, i16 %a177 %0 = load i16, ptr addrspace(3) %arrayidx, align 1178 %arrayidx1 = getelementptr inbounds [4 x i16], ptr addrspace(1) @arr0, i16 0, i16 %b179 %1 = load i16, ptr addrspace(1) %arrayidx1, align 1180 %sub = sub nsw i16 %0, %1181 ret i16 %sub182}183 184define i16 @foo3(i16 %a, i16 %b) {185; CHECK-LABEL: foo3:186; CHECK: ; %bb.0: ; %entry187; CHECK-NEXT: lsl r22188; CHECK-NEXT: rol r23189; CHECK-NEXT: subi r22, lo8(-(arr1))190; CHECK-NEXT: sbci r23, hi8(-(arr1))191; CHECK-NEXT: movw r30, r22192; CHECK-NEXT: ldi r18, 1193; CHECK-NEXT: out 59, r18194; CHECK-NEXT: elpm r20, Z+195; CHECK-NEXT: elpm r21, Z196; CHECK-NEXT: lsl r24197; CHECK-NEXT: rol r25198; CHECK-NEXT: subi r24, lo8(-(arr2))199; CHECK-NEXT: sbci r25, hi8(-(arr2))200; CHECK-NEXT: movw r30, r24201; CHECK-NEXT: ldi r18, 2202; CHECK-NEXT: out 59, r18203; CHECK-NEXT: elpm r24, Z+204; CHECK-NEXT: elpm r25, Z205; CHECK-NEXT: sub r24, r20206; CHECK-NEXT: sbc r25, r21207; CHECK-NEXT: ret208;209; NOX-LABEL: foo3:210; NOX: ; %bb.0: ; %entry211; NOX-NEXT: lsl r22212; NOX-NEXT: rol r23213; NOX-NEXT: subi r22, lo8(-(arr1))214; NOX-NEXT: sbci r23, hi8(-(arr1))215; NOX-NEXT: movw r30, r22216; NOX-NEXT: ldi r18, 1217; NOX-NEXT: out 59, r18218; NOX-NEXT: elpm219; NOX-NEXT: mov r20, r0220; NOX-NEXT: adiw r30, 1221; NOX-NEXT: elpm222; NOX-NEXT: mov r21, r0223; NOX-NEXT: lsl r24224; NOX-NEXT: rol r25225; NOX-NEXT: subi r24, lo8(-(arr2))226; NOX-NEXT: sbci r25, hi8(-(arr2))227; NOX-NEXT: movw r30, r24228; NOX-NEXT: ldi r18, 2229; NOX-NEXT: out 59, r18230; NOX-NEXT: elpm231; NOX-NEXT: mov r24, r0232; NOX-NEXT: adiw r30, 1233; NOX-NEXT: elpm234; NOX-NEXT: mov r25, r0235; NOX-NEXT: sub r24, r20236; NOX-NEXT: sbc r25, r21237; NOX-NEXT: ret238entry:239 %arrayidx = getelementptr inbounds [4 x i16], ptr addrspace(3) @arr2, i16 0, i16 %a240 %0 = load i16, ptr addrspace(3) %arrayidx, align 1241 %arrayidx1 = getelementptr inbounds [4 x i16], ptr addrspace(2) @arr1, i16 0, i16 %b242 %1 = load i16, ptr addrspace(2) %arrayidx1, align 1243 %sub = sub nsw i16 %0, %1244 ret i16 %sub245}246 247@arrb1 = addrspace(1) constant [4 x i8] c"abcd", align 1248@arrb3 = addrspace(3) constant [4 x i8] c"1234", align 1249@arrb5 = addrspace(5) constant [4 x i8] c"HJLQ", align 1250 251define signext i8 @foob0(i16 %a, i16 %b) {252; CHECK-LABEL: foob0:253; CHECK: ; %bb.0: ; %entry254; CHECK-NEXT: subi r22, lo8(-(arrb1))255; CHECK-NEXT: sbci r23, hi8(-(arrb1))256; CHECK-NEXT: movw r30, r22257; CHECK-NEXT: lpm r18, Z258; CHECK-NEXT: subi r24, lo8(-(arrb1))259; CHECK-NEXT: sbci r25, hi8(-(arrb1))260; CHECK-NEXT: movw r30, r24261; CHECK-NEXT: lpm r24, Z262; CHECK-NEXT: sub r24, r18263; CHECK-NEXT: mov r25, r24264; CHECK-NEXT: lsl r25265; CHECK-NEXT: sbc r25, r25266; CHECK-NEXT: ret267;268; NOX-LABEL: foob0:269; NOX: ; %bb.0: ; %entry270; NOX-NEXT: subi r22, lo8(-(arrb1))271; NOX-NEXT: sbci r23, hi8(-(arrb1))272; NOX-NEXT: movw r30, r22273; NOX-NEXT: lpm274; NOX-NEXT: mov r18, r0275; NOX-NEXT: subi r24, lo8(-(arrb1))276; NOX-NEXT: sbci r25, hi8(-(arrb1))277; NOX-NEXT: movw r30, r24278; NOX-NEXT: lpm279; NOX-NEXT: mov r24, r0280; NOX-NEXT: sub r24, r18281; NOX-NEXT: mov r25, r24282; NOX-NEXT: lsl r25283; NOX-NEXT: sbc r25, r25284; NOX-NEXT: ret285entry:286 %arrayidx = getelementptr inbounds [4 x i8], ptr addrspace(1) @arrb1, i16 0, i16 %a287 %0 = load i8, ptr addrspace(1) %arrayidx, align 1288 %arrayidx1 = getelementptr inbounds [4 x i8], ptr addrspace(1) @arrb1, i16 0, i16 %b289 %1 = load i8, ptr addrspace(1) %arrayidx1, align 1290 %sub = sub i8 %0, %1291 ret i8 %sub292}293 294define signext i8 @foob1(i16 %a, i16 %b) {295; CHECK-LABEL: foob1:296; CHECK: ; %bb.0: ; %entry297; CHECK-NEXT: subi r22, lo8(-(arrb3))298; CHECK-NEXT: sbci r23, hi8(-(arrb3))299; CHECK-NEXT: movw r30, r22300; CHECK-NEXT: ldi r18, 2301; CHECK-NEXT: out 59, r18302; CHECK-NEXT: elpm r18, Z303; CHECK-NEXT: subi r24, lo8(-(arrb1))304; CHECK-NEXT: sbci r25, hi8(-(arrb1))305; CHECK-NEXT: movw r30, r24306; CHECK-NEXT: lpm r24, Z307; CHECK-NEXT: sub r24, r18308; CHECK-NEXT: mov r25, r24309; CHECK-NEXT: lsl r25310; CHECK-NEXT: sbc r25, r25311; CHECK-NEXT: ret312;313; NOX-LABEL: foob1:314; NOX: ; %bb.0: ; %entry315; NOX-NEXT: subi r22, lo8(-(arrb3))316; NOX-NEXT: sbci r23, hi8(-(arrb3))317; NOX-NEXT: movw r30, r22318; NOX-NEXT: ldi r18, 2319; NOX-NEXT: out 59, r18320; NOX-NEXT: elpm321; NOX-NEXT: mov r18, r0322; NOX-NEXT: subi r24, lo8(-(arrb1))323; NOX-NEXT: sbci r25, hi8(-(arrb1))324; NOX-NEXT: movw r30, r24325; NOX-NEXT: lpm326; NOX-NEXT: mov r24, r0327; NOX-NEXT: sub r24, r18328; NOX-NEXT: mov r25, r24329; NOX-NEXT: lsl r25330; NOX-NEXT: sbc r25, r25331; NOX-NEXT: ret332entry:333 %arrayidx = getelementptr inbounds [4 x i8], ptr addrspace(1) @arrb1, i16 0, i16 %a334 %0 = load i8, ptr addrspace(1) %arrayidx, align 1335 %arrayidx1 = getelementptr inbounds [4 x i8], ptr addrspace(3) @arrb3, i16 0, i16 %b336 %1 = load i8, ptr addrspace(3) %arrayidx1, align 1337 %sub = sub i8 %0, %1338 ret i8 %sub339}340 341define signext i8 @foob2(i16 %a, i16 %b) {342; CHECK-LABEL: foob2:343; CHECK: ; %bb.0: ; %entry344; CHECK-NEXT: subi r24, lo8(-(arrb5))345; CHECK-NEXT: sbci r25, hi8(-(arrb5))346; CHECK-NEXT: movw r30, r24347; CHECK-NEXT: ldi r24, 4348; CHECK-NEXT: out 59, r24349; CHECK-NEXT: elpm r24, Z350; CHECK-NEXT: subi r22, lo8(-(arrb1))351; CHECK-NEXT: sbci r23, hi8(-(arrb1))352; CHECK-NEXT: movw r30, r22353; CHECK-NEXT: lpm r25, Z354; CHECK-NEXT: sub r24, r25355; CHECK-NEXT: mov r25, r24356; CHECK-NEXT: lsl r25357; CHECK-NEXT: sbc r25, r25358; CHECK-NEXT: ret359;360; NOX-LABEL: foob2:361; NOX: ; %bb.0: ; %entry362; NOX-NEXT: subi r24, lo8(-(arrb5))363; NOX-NEXT: sbci r25, hi8(-(arrb5))364; NOX-NEXT: movw r30, r24365; NOX-NEXT: ldi r24, 4366; NOX-NEXT: out 59, r24367; NOX-NEXT: elpm368; NOX-NEXT: mov r24, r0369; NOX-NEXT: subi r22, lo8(-(arrb1))370; NOX-NEXT: sbci r23, hi8(-(arrb1))371; NOX-NEXT: movw r30, r22372; NOX-NEXT: lpm373; NOX-NEXT: mov r25, r0374; NOX-NEXT: sub r24, r25375; NOX-NEXT: mov r25, r24376; NOX-NEXT: lsl r25377; NOX-NEXT: sbc r25, r25378; NOX-NEXT: ret379entry:380 %arrayidx = getelementptr inbounds [4 x i8], ptr addrspace(5) @arrb5, i16 0, i16 %a381 %0 = load i8, ptr addrspace(5) %arrayidx, align 1382 %arrayidx1 = getelementptr inbounds [4 x i8], ptr addrspace(1) @arrb1, i16 0, i16 %b383 %1 = load i8, ptr addrspace(1) %arrayidx1, align 1384 %sub = sub i8 %0, %1385 ret i8 %sub386}387 388define signext i8 @foob3(i16 %a, i16 %b) {389; CHECK-LABEL: foob3:390; CHECK: ; %bb.0: ; %entry391; CHECK-NEXT: subi r22, lo8(-(arrb5))392; CHECK-NEXT: sbci r23, hi8(-(arrb5))393; CHECK-NEXT: movw r30, r22394; CHECK-NEXT: ldi r18, 4395; CHECK-NEXT: out 59, r18396; CHECK-NEXT: elpm r18, Z397; CHECK-NEXT: subi r24, lo8(-(arrb3))398; CHECK-NEXT: sbci r25, hi8(-(arrb3))399; CHECK-NEXT: movw r30, r24400; CHECK-NEXT: ldi r24, 2401; CHECK-NEXT: out 59, r24402; CHECK-NEXT: elpm r24, Z403; CHECK-NEXT: sub r24, r18404; CHECK-NEXT: mov r25, r24405; CHECK-NEXT: lsl r25406; CHECK-NEXT: sbc r25, r25407; CHECK-NEXT: ret408;409; NOX-LABEL: foob3:410; NOX: ; %bb.0: ; %entry411; NOX-NEXT: subi r22, lo8(-(arrb5))412; NOX-NEXT: sbci r23, hi8(-(arrb5))413; NOX-NEXT: movw r30, r22414; NOX-NEXT: ldi r18, 4415; NOX-NEXT: out 59, r18416; NOX-NEXT: elpm417; NOX-NEXT: mov r18, r0418; NOX-NEXT: subi r24, lo8(-(arrb3))419; NOX-NEXT: sbci r25, hi8(-(arrb3))420; NOX-NEXT: movw r30, r24421; NOX-NEXT: ldi r24, 2422; NOX-NEXT: out 59, r24423; NOX-NEXT: elpm424; NOX-NEXT: mov r24, r0425; NOX-NEXT: sub r24, r18426; NOX-NEXT: mov r25, r24427; NOX-NEXT: lsl r25428; NOX-NEXT: sbc r25, r25429; NOX-NEXT: ret430entry:431 %arrayidx = getelementptr inbounds [4 x i8], ptr addrspace(3) @arrb3, i16 0, i16 %a432 %0 = load i8, ptr addrspace(3) %arrayidx, align 1433 %arrayidx1 = getelementptr inbounds [4 x i8], ptr addrspace(5) @arrb5, i16 0, i16 %b434 %1 = load i8, ptr addrspace(5) %arrayidx1, align 1435 %sub = sub i8 %0, %1436 ret i8 %sub437}438 439define signext i8 @foob4(i16 %a, i16 %b) {440; CHECK-LABEL: foob4:441; CHECK: ; %bb.0: ; %entry442; CHECK-NEXT: subi r22, lo8(-(arrb3))443; CHECK-NEXT: sbci r23, hi8(-(arrb3))444; CHECK-NEXT: movw r30, r22445; CHECK-NEXT: ldi r18, 2446; CHECK-NEXT: out 59, r18447; CHECK-NEXT: elpm r19, Z448; CHECK-NEXT: subi r24, lo8(-(arrb3))449; CHECK-NEXT: sbci r25, hi8(-(arrb3))450; CHECK-NEXT: movw r30, r24451; CHECK-NEXT: out 59, r18452; CHECK-NEXT: elpm r24, Z453; CHECK-NEXT: sub r24, r19454; CHECK-NEXT: mov r25, r24455; CHECK-NEXT: lsl r25456; CHECK-NEXT: sbc r25, r25457; CHECK-NEXT: ret458;459; NOX-LABEL: foob4:460; NOX: ; %bb.0: ; %entry461; NOX-NEXT: subi r22, lo8(-(arrb3))462; NOX-NEXT: sbci r23, hi8(-(arrb3))463; NOX-NEXT: movw r30, r22464; NOX-NEXT: ldi r18, 2465; NOX-NEXT: out 59, r18466; NOX-NEXT: elpm467; NOX-NEXT: mov r19, r0468; NOX-NEXT: subi r24, lo8(-(arrb3))469; NOX-NEXT: sbci r25, hi8(-(arrb3))470; NOX-NEXT: movw r30, r24471; NOX-NEXT: out 59, r18472; NOX-NEXT: elpm473; NOX-NEXT: mov r24, r0474; NOX-NEXT: sub r24, r19475; NOX-NEXT: mov r25, r24476; NOX-NEXT: lsl r25477; NOX-NEXT: sbc r25, r25478; NOX-NEXT: ret479entry:480 %arrayidx = getelementptr inbounds [4 x i8], ptr addrspace(3) @arrb3, i16 0, i16 %a481 %0 = load i8, ptr addrspace(3) %arrayidx, align 1482 %arrayidx1 = getelementptr inbounds [4 x i8], ptr addrspace(3) @arrb3, i16 0, i16 %b483 %1 = load i8, ptr addrspace(3) %arrayidx1, align 1484 %sub = sub i8 %0, %1485 ret i8 %sub486}487