brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.7 KiB · 3421484 Raw
362 lines · plain
1; RUN: llc < %s -mtriple=xcore | FileCheck %s2; RUN: llc < %s -mtriple=xcore -frame-pointer=all | FileCheck %s -check-prefix=CHECKFP3 4declare ptr @llvm.frameaddress(i32) nounwind readnone5declare ptr @llvm.returnaddress(i32) nounwind6declare ptr @llvm.eh.dwarf.cfa(i32) nounwind7declare void @llvm.eh.return.i32(i32, ptr) nounwind8declare void @llvm.eh.unwind.init() nounwind9 10define ptr @FA0() nounwind {11entry:12; CHECK-LABEL: FA013; CHECK: ldaw r0, sp[0]14; CHECK-NEXT: retsp 015  %0 = call ptr @llvm.frameaddress(i32 0)16  ret ptr %017}18 19define ptr @FA1() nounwind {20entry:21; CHECK-LABEL: FA122; CHECK: entsp 10023; CHECK-NEXT: ldaw r0, sp[0]24; CHECK-NEXT: retsp 10025  %0 = alloca [100 x i32]26  %1 = call ptr @llvm.frameaddress(i32 0)27  ret ptr %128}29 30define ptr @RA0() nounwind {31entry:32; CHECK-LABEL: RA033; CHECK: stw lr, sp[0]34; CHECK-NEXT: ldw r0, sp[0]35; CHECK-NEXT: ldw lr, sp[0]36; CHECK-NEXT: retsp 037  %0 = call ptr @llvm.returnaddress(i32 0)38  ret ptr %039}40 41define ptr @RA1() nounwind {42entry:43; CHECK-LABEL: RA144; CHECK: entsp 10045; CHECK-NEXT: ldw r0, sp[100]46; CHECK-NEXT: retsp 10047  %0 = alloca [100 x i32]48  %1 = call ptr @llvm.returnaddress(i32 0)49  ret ptr %150}51 52; test FRAME_TO_ARGS_OFFSET lowering53define ptr @FTAO0() nounwind {54entry:55; CHECK-LABEL: FTAO056; CHECK: ldc r0, 057; CHECK-NEXT: ldaw r1, sp[0]58; CHECK-NEXT: add r0, r1, r059; CHECK-NEXT: retsp 060  %0 = call ptr @llvm.eh.dwarf.cfa(i32 0)61  ret ptr %062}63 64define ptr @FTAO1() nounwind {65entry:66; CHECK-LABEL: FTAO167; CHECK: entsp 10068; CHECK-NEXT: ldc r0, 40069; CHECK-NEXT: ldaw r1, sp[0]70; CHECK-NEXT: add r0, r1, r071; CHECK-NEXT: retsp 10072  %0 = alloca [100 x i32]73  %1 = call ptr @llvm.eh.dwarf.cfa(i32 0)74  ret ptr %175}76 77define ptr @EH0(i32 %offset, ptr %handler) {78entry:79; CHECK-LABEL: EH080; CHECK: entsp 281; CHECK: .cfi_def_cfa_offset 882; CHECK: .cfi_offset 15, 083; CHECK: .cfi_offset 1, -884; CHECK: .cfi_offset 0, -485; CHECK: ldc r2, 886; CHECK-NEXT: ldaw r3, sp[0]87; CHECK-NEXT: add r2, r3, r288; CHECK-NEXT: add r2, r2, r089; CHECK-NEXT: mov r3, r190; CHECK-NEXT: ldw r1, sp[0]91; CHECK-NEXT: ldw r0, sp[1]92; CHECK-NEXT: set sp, r293; CHECK-NEXT: bau r394  call void @llvm.eh.return.i32(i32 %offset, ptr %handler)95  unreachable96}97 98declare void @foo(...)99define ptr @EH1(i32 %offset, ptr %handler) {100entry:101; CHECK-LABEL: EH1102; CHECK: entsp 5103; CHECK: .cfi_def_cfa_offset 20104; CHECK: .cfi_offset 15, 0105; CHECK: .cfi_offset 1, -16106; CHECK: .cfi_offset 0, -12107; CHECK: stw r4, sp[4]108; CHECK: .cfi_offset 4, -4109; CHECK: stw r5, sp[3]110; CHECK: .cfi_offset 5, -8111; CHECK: mov r4, r1112; CHECK-NEXT: mov r5, r0113; CHECK-NEXT: bl foo114; CHECK-NEXT: ldc r0, 20115; CHECK-NEXT: ldaw r1, sp[0]116; CHECK-NEXT: add r0, r1, r0117; CHECK-NEXT: add r2, r0, r5118; CHECK-NEXT: mov r3, r4119; CHECK-NEXT: ldw r5, sp[3]120; CHECK-NEXT: ldw r4, sp[4]121; CHECK-NEXT: ldw r1, sp[1]122; CHECK-NEXT: ldw r0, sp[2]123; CHECK-NEXT: set sp, r2124; CHECK-NEXT: bau r3125  call void (...) @foo()126  call void @llvm.eh.return.i32(i32 %offset, ptr %handler)127  unreachable128}129 130@offset = external constant i32131@handler = external constant i8132define ptr @EH2(i32 %r0, i32 %r1, i32 %r2, i32 %r3) {133entry:134; CHECK-LABEL: EH2135; CHECK: entsp 3136; CHECK: bl foo137; CHECK-NEXT: ldw r0, dp[offset]138; CHECK-NEXT: ldc r1, 12139; CHECK-NEXT: ldaw r2, sp[0]140; CHECK-NEXT: add r1, r2, r1141; CHECK-NEXT: add r2, r1, r0142; CHECK-NEXT: ldaw r3, dp[handler]143; CHECK-NEXT: ldw r1, sp[1]144; CHECK-NEXT: ldw r0, sp[2]145; CHECK-NEXT: set sp, r2146; CHECK-NEXT: bau r3147  call void (...) @foo()148  %0 = load i32, ptr @offset149  call void @llvm.eh.return.i32(i32 %0, ptr @handler)150  unreachable151}152 153 154; FP: spill FP+SR+R0:1+R4:9 = entsp 2+2+6155; But we dont actually spill or restore R0:1156; CHECKFP-LABEL: Unwind0:157; CHECKFP: entsp 10158; CHECKFP: stw r10, sp[1]159; CHECKFP: ldaw r10, sp[0]160; CHECKFP: stw r4, r10[9]161; CHECKFP: stw r5, r10[8]162; CHECKFP: stw r6, r10[7]163; CHECKFP: stw r7, r10[6]164; CHECKFP: stw r8, r10[5]165; CHECKFP: stw r9, r10[4]166; CHECKFP: ldw r9, r10[4]167; CHECKFP: ldw r8, r10[5]168; CHECKFP: ldw r7, r10[6]169; CHECKFP: ldw r6, r10[7]170; CHECKFP: ldw r5, r10[8]171; CHECKFP: ldw r4, r10[9]172; CHECKFP: set sp, r10173; CHECKFP: ldw r10, sp[1]174; CHECKFP: retsp 10175;176; !FP: spill R0:1+R4:10 = entsp 2+7177; But we dont actually spill or restore R0:1178; CHECK-LABEL: Unwind0:179; CHECK: entsp 9180; CHECK: stw r4, sp[8]181; CHECK: stw r5, sp[7]182; CHECK: stw r6, sp[6]183; CHECK: stw r7, sp[5]184; CHECK: stw r8, sp[4]185; CHECK: stw r9, sp[3]186; CHECK: stw r10, sp[2]187; CHECK: ldw r10, sp[2]188; CHECK: ldw r9, sp[3]189; CHECK: ldw r8, sp[4]190; CHECK: ldw r7, sp[5]191; CHECK: ldw r6, sp[6]192; CHECK: ldw r5, sp[7]193; CHECK: ldw r4, sp[8]194; CHECK: retsp 9195define void @Unwind0() {196  call void @llvm.eh.unwind.init()197  ret void198}199 200 201; FP: spill FP+SR+R0:1+R4:9+LR = entsp 2+2+6 + extsp 1202; But we dont actually spill or restore R0:1203; CHECKFP-LABEL: Unwind1:204; CHECKFP: entsp 10205; CHECKFP: stw r10, sp[1]206; CHECKFP: ldaw r10, sp[0]207; CHECKFP: stw r4, r10[9]208; CHECKFP: stw r5, r10[8]209; CHECKFP: stw r6, r10[7]210; CHECKFP: stw r7, r10[6]211; CHECKFP: stw r8, r10[5]212; CHECKFP: stw r9, r10[4]213; CHECKFP: extsp 1214; CHECKFP: bl foo215; CHECKFP: ldaw sp, sp[1]216; CHECKFP: ldw r9, r10[4]217; CHECKFP: ldw r8, r10[5]218; CHECKFP: ldw r7, r10[6]219; CHECKFP: ldw r6, r10[7]220; CHECKFP: ldw r5, r10[8]221; CHECKFP: ldw r4, r10[9]222; CHECKFP: set sp, r10223; CHECKFP: ldw r10, sp[1]224; CHECKFP: retsp 10225;226; !FP: spill R0:1+R4:10+LR = entsp 2+7+1227; But we dont actually spill or restore R0:1228; CHECK-LABEL: Unwind1:229; CHECK: entsp 10230; CHECK: stw r4, sp[9]231; CHECK: stw r5, sp[8]232; CHECK: stw r6, sp[7]233; CHECK: stw r7, sp[6]234; CHECK: stw r8, sp[5]235; CHECK: stw r9, sp[4]236; CHECK: stw r10, sp[3]237; CHECK: bl foo238; CHECK: ldw r10, sp[3]239; CHECK: ldw r9, sp[4]240; CHECK: ldw r8, sp[5]241; CHECK: ldw r7, sp[6]242; CHECK: ldw r6, sp[7]243; CHECK: ldw r5, sp[8]244; CHECK: ldw r4, sp[9]245; CHECK: retsp 10246define void @Unwind1() {247  call void (...) @foo()248  call void @llvm.eh.unwind.init()249  ret void250}251 252; FP: spill FP+SR+R0:1+R4:9 = entsp 2+2+6253; We dont spill R0:1254; We only restore R0:1 during eh.return255; CHECKFP-LABEL: UnwindEH:256; CHECKFP: entsp 10257; CHECKFP: .cfi_def_cfa_offset 40258; CHECKFP: .cfi_offset 15, 0259; CHECKFP: stw r10, sp[1]260; CHECKFP: .cfi_offset 10, -36261; CHECKFP: ldaw r10, sp[0]262; CHECKFP: .cfi_def_cfa_register 10263; CHECKFP: .cfi_offset 1, -32264; CHECKFP: .cfi_offset 0, -28265; CHECKFP: stw r4, r10[9]266; CHECKFP: .cfi_offset 4, -4267; CHECKFP: stw r5, r10[8]268; CHECKFP: .cfi_offset 5, -8269; CHECKFP: stw r6, r10[7]270; CHECKFP: .cfi_offset 6, -12271; CHECKFP: stw r7, r10[6]272; CHECKFP: .cfi_offset 7, -16273; CHECKFP: stw r8, r10[5]274; CHECKFP: .cfi_offset 8, -20275; CHECKFP: stw r9, r10[4]276; CHECKFP: .cfi_offset 9, -24277; CHECKFP: bt r0, .LBB{{[0-9_]+}}278; CHECKFP: ldw r9, r10[4]279; CHECKFP-NEXT: ldw r8, r10[5]280; CHECKFP-NEXT: ldw r7, r10[6]281; CHECKFP-NEXT: ldw r6, r10[7]282; CHECKFP-NEXT: ldw r5, r10[8]283; CHECKFP-NEXT: ldw r4, r10[9]284; CHECKFP-NEXT: set sp, r10285; CHECKFP-NEXT: ldw r10, sp[1]286; CHECKFP-NEXT: retsp 10287; CHECKFP: .LBB{{[0-9_]+}}288; CHECKFP-NEXT: ldc r2, 40289; CHECKFP-NEXT: add r2, r10, r2290; CHECKFP-NEXT: add r2, r2, r0291; CHECKFP-NEXT: mov r3, r1292; CHECKFP-NEXT: ldw r9, r10[4]293; CHECKFP-NEXT: ldw r8, r10[5]294; CHECKFP-NEXT: ldw r7, r10[6]295; CHECKFP-NEXT: ldw r6, r10[7]296; CHECKFP-NEXT: ldw r5, r10[8]297; CHECKFP-NEXT: ldw r4, r10[9]298; CHECKFP-NEXT: ldw r1, sp[2]299; CHECKFP-NEXT: ldw r0, sp[3]300; CHECKFP-NEXT: set sp, r2301; CHECKFP-NEXT: bau r3302;303; !FP: spill R0:1+R4:10 = entsp 2+7304; We dont spill R0:1305; We only restore R0:1 during eh.return306; CHECK-LABEL: UnwindEH:307; CHECK: entsp 9308; CHECK: .cfi_def_cfa_offset 36309; CHECK: .cfi_offset 15, 0310; CHECK: .cfi_offset 1, -36311; CHECK: .cfi_offset 0, -32312; CHECK: stw r4, sp[8]313; CHECK: .cfi_offset 4, -4314; CHECK: stw r5, sp[7]315; CHECK: .cfi_offset 5, -8316; CHECK: stw r6, sp[6]317; CHECK: .cfi_offset 6, -12318; CHECK: stw r7, sp[5]319; CHECK: .cfi_offset 7, -16320; CHECK: stw r8, sp[4]321; CHECK: .cfi_offset 8, -20322; CHECK: stw r9, sp[3]323; CHECK: .cfi_offset 9, -24324; CHECK: stw r10, sp[2]325; CHECK: .cfi_offset 10, -28326; CHECK: bt r0, .LBB{{[0-9_]+}}327; CHECK: ldw r10, sp[2]328; CHECK-NEXT: ldw r9, sp[3]329; CHECK-NEXT: ldw r8, sp[4]330; CHECK-NEXT: ldw r7, sp[5]331; CHECK-NEXT: ldw r6, sp[6]332; CHECK-NEXT: ldw r5, sp[7]333; CHECK-NEXT: ldw r4, sp[8]334; CHECK-NEXT: retsp 9335; CHECK: .LBB{{[0-9_]+}}336; CHECK-NEXT: ldc r2, 36337; CHECK-NEXT: ldaw r3, sp[0]338; CHECK-NEXT: add r2, r3, r2339; CHECK-NEXT: add r2, r2, r0340; CHECK-NEXT: mov r3, r1341; CHECK-NEXT: ldw r10, sp[2]342; CHECK-NEXT: ldw r9, sp[3]343; CHECK-NEXT: ldw r8, sp[4]344; CHECK-NEXT: ldw r7, sp[5]345; CHECK-NEXT: ldw r6, sp[6]346; CHECK-NEXT: ldw r5, sp[7]347; CHECK-NEXT: ldw r4, sp[8]348; CHECK-NEXT: ldw r1, sp[0]349; CHECK-NEXT: ldw r0, sp[1]350; CHECK-NEXT: set sp, r2351; CHECK-NEXT: bau r3352define void @UnwindEH(i32 %offset, ptr %handler) {353  call void @llvm.eh.unwind.init()354  %cmp = icmp eq i32 %offset, 0355  br i1 %cmp, label %normal, label %eh356eh:357  call void @llvm.eh.return.i32(i32 %offset, ptr %handler)358  unreachable359normal:360  ret void361}362