545 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --extra_scrub2; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -O0 -global-isel=0 -global-isel-abort=0 < %s | FileCheck %s3; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -O0 -global-isel=1 -global-isel-abort=0 < %s | FileCheck %s --check-prefix=GISEL4 5; Test that z0 is saved/restored, as the unwinder may only retain the low 64bits (d0).6define <vscale x 4 x i32> @invoke_callee_may_throw_sve(<vscale x 4 x i32> %v) uwtable personality i8 0 {7; CHECK-LABEL: invoke_callee_may_throw_sve:8; CHECK: .Lfunc_begin0:9; CHECK-NEXT: .cfi_startproc10; CHECK-NEXT: // %bb.0:11; CHECK-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill12; CHECK-NEXT: .cfi_def_cfa_offset 1613; CHECK-NEXT: .cfi_offset w30, -814; CHECK-NEXT: .cfi_offset w29, -1615; CHECK-NEXT: addvl sp, sp, #-1816; CHECK-NEXT: .cfi_escape 0x0f, 0x0a, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x11, 0x90, 0x01, 0x1e, 0x22 // sp + 16 + 144 * VG17; CHECK-NEXT: str p15, [sp, #4, mul vl] // 2-byte Spill18; CHECK-NEXT: str p14, [sp, #5, mul vl] // 2-byte Spill19; CHECK-NEXT: str p13, [sp, #6, mul vl] // 2-byte Spill20; CHECK-NEXT: str p12, [sp, #7, mul vl] // 2-byte Spill21; CHECK-NEXT: str p11, [sp, #8, mul vl] // 2-byte Spill22; CHECK-NEXT: str p10, [sp, #9, mul vl] // 2-byte Spill23; CHECK-NEXT: str p9, [sp, #10, mul vl] // 2-byte Spill24; CHECK-NEXT: str p8, [sp, #11, mul vl] // 2-byte Spill25; CHECK-NEXT: str p7, [sp, #12, mul vl] // 2-byte Spill26; CHECK-NEXT: str p6, [sp, #13, mul vl] // 2-byte Spill27; CHECK-NEXT: str p5, [sp, #14, mul vl] // 2-byte Spill28; CHECK-NEXT: str p4, [sp, #15, mul vl] // 2-byte Spill29; CHECK-NEXT: str z23, [sp, #2, mul vl] // 16-byte Folded Spill30; CHECK-NEXT: str z22, [sp, #3, mul vl] // 16-byte Folded Spill31; CHECK-NEXT: str z21, [sp, #4, mul vl] // 16-byte Folded Spill32; CHECK-NEXT: str z20, [sp, #5, mul vl] // 16-byte Folded Spill33; CHECK-NEXT: str z19, [sp, #6, mul vl] // 16-byte Folded Spill34; CHECK-NEXT: str z18, [sp, #7, mul vl] // 16-byte Folded Spill35; CHECK-NEXT: str z17, [sp, #8, mul vl] // 16-byte Folded Spill36; CHECK-NEXT: str z16, [sp, #9, mul vl] // 16-byte Folded Spill37; CHECK-NEXT: str z15, [sp, #10, mul vl] // 16-byte Folded Spill38; CHECK-NEXT: str z14, [sp, #11, mul vl] // 16-byte Folded Spill39; CHECK-NEXT: str z13, [sp, #12, mul vl] // 16-byte Folded Spill40; CHECK-NEXT: str z12, [sp, #13, mul vl] // 16-byte Folded Spill41; CHECK-NEXT: str z11, [sp, #14, mul vl] // 16-byte Folded Spill42; CHECK-NEXT: str z10, [sp, #15, mul vl] // 16-byte Folded Spill43; CHECK-NEXT: str z9, [sp, #16, mul vl] // 16-byte Folded Spill44; CHECK-NEXT: str z8, [sp, #17, mul vl] // 16-byte Folded Spill45; CHECK-NEXT: .cfi_escape 0x10, 0x48, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x78, 0x1e, 0x22, 0x40, 0x1c // $d8 @ cfa - 8 * VG - 1646; CHECK-NEXT: .cfi_escape 0x10, 0x49, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x70, 0x1e, 0x22, 0x40, 0x1c // $d9 @ cfa - 16 * VG - 1647; CHECK-NEXT: .cfi_escape 0x10, 0x4a, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x68, 0x1e, 0x22, 0x40, 0x1c // $d10 @ cfa - 24 * VG - 1648; CHECK-NEXT: .cfi_escape 0x10, 0x4b, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x60, 0x1e, 0x22, 0x40, 0x1c // $d11 @ cfa - 32 * VG - 1649; CHECK-NEXT: .cfi_escape 0x10, 0x4c, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x58, 0x1e, 0x22, 0x40, 0x1c // $d12 @ cfa - 40 * VG - 1650; CHECK-NEXT: .cfi_escape 0x10, 0x4d, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x50, 0x1e, 0x22, 0x40, 0x1c // $d13 @ cfa - 48 * VG - 1651; CHECK-NEXT: .cfi_escape 0x10, 0x4e, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x48, 0x1e, 0x22, 0x40, 0x1c // $d14 @ cfa - 56 * VG - 1652; CHECK-NEXT: .cfi_escape 0x10, 0x4f, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x40, 0x1e, 0x22, 0x40, 0x1c // $d15 @ cfa - 64 * VG - 1653; CHECK-NEXT: addvl sp, sp, #-254; CHECK-NEXT: .cfi_escape 0x0f, 0x0a, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x11, 0xa0, 0x01, 0x1e, 0x22 // sp + 16 + 160 * VG55; CHECK-NEXT: .cfi_remember_state56; CHECK-NEXT: str z0, [sp] // 16-byte Folded Spill57; CHECK-NEXT: .Ltmp0: // EH_LABEL58; CHECK-NEXT: bl may_throw_sve59; CHECK-NEXT: .Ltmp1: // EH_LABEL60; CHECK-NEXT: str z0, [sp, #1, mul vl] // 16-byte Folded Spill61; CHECK-NEXT: b .LBB0_162; CHECK-NEXT: .LBB0_1: // %.Lcontinue63; CHECK-NEXT: ldr z0, [sp, #1, mul vl] // 16-byte Folded Reload64; CHECK-NEXT: addvl sp, sp, #265; CHECK-NEXT: .cfi_escape 0x0f, 0x0a, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x11, 0x90, 0x01, 0x1e, 0x22 // sp + 16 + 144 * VG66; CHECK-NEXT: ldr z23, [sp, #2, mul vl] // 16-byte Folded Reload67; CHECK-NEXT: ldr z22, [sp, #3, mul vl] // 16-byte Folded Reload68; CHECK-NEXT: ldr z21, [sp, #4, mul vl] // 16-byte Folded Reload69; CHECK-NEXT: ldr z20, [sp, #5, mul vl] // 16-byte Folded Reload70; CHECK-NEXT: ldr z19, [sp, #6, mul vl] // 16-byte Folded Reload71; CHECK-NEXT: ldr z18, [sp, #7, mul vl] // 16-byte Folded Reload72; CHECK-NEXT: ldr z17, [sp, #8, mul vl] // 16-byte Folded Reload73; CHECK-NEXT: ldr z16, [sp, #9, mul vl] // 16-byte Folded Reload74; CHECK-NEXT: ldr z15, [sp, #10, mul vl] // 16-byte Folded Reload75; CHECK-NEXT: ldr z14, [sp, #11, mul vl] // 16-byte Folded Reload76; CHECK-NEXT: ldr z13, [sp, #12, mul vl] // 16-byte Folded Reload77; CHECK-NEXT: ldr z12, [sp, #13, mul vl] // 16-byte Folded Reload78; CHECK-NEXT: ldr z11, [sp, #14, mul vl] // 16-byte Folded Reload79; CHECK-NEXT: ldr z10, [sp, #15, mul vl] // 16-byte Folded Reload80; CHECK-NEXT: ldr z9, [sp, #16, mul vl] // 16-byte Folded Reload81; CHECK-NEXT: ldr z8, [sp, #17, mul vl] // 16-byte Folded Reload82; CHECK-NEXT: ldr p15, [sp, #4, mul vl] // 2-byte Reload83; CHECK-NEXT: ldr p14, [sp, #5, mul vl] // 2-byte Reload84; CHECK-NEXT: ldr p13, [sp, #6, mul vl] // 2-byte Reload85; CHECK-NEXT: ldr p12, [sp, #7, mul vl] // 2-byte Reload86; CHECK-NEXT: ldr p11, [sp, #8, mul vl] // 2-byte Reload87; CHECK-NEXT: ldr p10, [sp, #9, mul vl] // 2-byte Reload88; CHECK-NEXT: ldr p9, [sp, #10, mul vl] // 2-byte Reload89; CHECK-NEXT: ldr p8, [sp, #11, mul vl] // 2-byte Reload90; CHECK-NEXT: ldr p7, [sp, #12, mul vl] // 2-byte Reload91; CHECK-NEXT: ldr p6, [sp, #13, mul vl] // 2-byte Reload92; CHECK-NEXT: ldr p5, [sp, #14, mul vl] // 2-byte Reload93; CHECK-NEXT: ldr p4, [sp, #15, mul vl] // 2-byte Reload94; CHECK-NEXT: addvl sp, sp, #1895; CHECK-NEXT: .cfi_def_cfa wsp, 1696; CHECK-NEXT: .cfi_restore z897; CHECK-NEXT: .cfi_restore z998; CHECK-NEXT: .cfi_restore z1099; CHECK-NEXT: .cfi_restore z11100; CHECK-NEXT: .cfi_restore z12101; CHECK-NEXT: .cfi_restore z13102; CHECK-NEXT: .cfi_restore z14103; CHECK-NEXT: .cfi_restore z15104; CHECK-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload105; CHECK-NEXT: .cfi_def_cfa_offset 0106; CHECK-NEXT: .cfi_restore w30107; CHECK-NEXT: .cfi_restore w29108; CHECK-NEXT: ret109; CHECK-NEXT: .LBB0_2: // %.Lunwind110; CHECK-NEXT: .cfi_restore_state111; CHECK-NEXT: .Ltmp2: // EH_LABEL112; CHECK-NEXT: ldr z0, [sp] // 16-byte Folded Reload113; CHECK-NEXT: addvl sp, sp, #2114; CHECK-NEXT: .cfi_escape 0x0f, 0x0a, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x11, 0x90, 0x01, 0x1e, 0x22 // sp + 16 + 144 * VG115; CHECK-NEXT: ldr z23, [sp, #2, mul vl] // 16-byte Folded Reload116; CHECK-NEXT: ldr z22, [sp, #3, mul vl] // 16-byte Folded Reload117; CHECK-NEXT: ldr z21, [sp, #4, mul vl] // 16-byte Folded Reload118; CHECK-NEXT: ldr z20, [sp, #5, mul vl] // 16-byte Folded Reload119; CHECK-NEXT: ldr z19, [sp, #6, mul vl] // 16-byte Folded Reload120; CHECK-NEXT: ldr z18, [sp, #7, mul vl] // 16-byte Folded Reload121; CHECK-NEXT: ldr z17, [sp, #8, mul vl] // 16-byte Folded Reload122; CHECK-NEXT: ldr z16, [sp, #9, mul vl] // 16-byte Folded Reload123; CHECK-NEXT: ldr z15, [sp, #10, mul vl] // 16-byte Folded Reload124; CHECK-NEXT: ldr z14, [sp, #11, mul vl] // 16-byte Folded Reload125; CHECK-NEXT: ldr z13, [sp, #12, mul vl] // 16-byte Folded Reload126; CHECK-NEXT: ldr z12, [sp, #13, mul vl] // 16-byte Folded Reload127; CHECK-NEXT: ldr z11, [sp, #14, mul vl] // 16-byte Folded Reload128; CHECK-NEXT: ldr z10, [sp, #15, mul vl] // 16-byte Folded Reload129; CHECK-NEXT: ldr z9, [sp, #16, mul vl] // 16-byte Folded Reload130; CHECK-NEXT: ldr z8, [sp, #17, mul vl] // 16-byte Folded Reload131; CHECK-NEXT: ldr p15, [sp, #4, mul vl] // 2-byte Reload132; CHECK-NEXT: ldr p14, [sp, #5, mul vl] // 2-byte Reload133; CHECK-NEXT: ldr p13, [sp, #6, mul vl] // 2-byte Reload134; CHECK-NEXT: ldr p12, [sp, #7, mul vl] // 2-byte Reload135; CHECK-NEXT: ldr p11, [sp, #8, mul vl] // 2-byte Reload136; CHECK-NEXT: ldr p10, [sp, #9, mul vl] // 2-byte Reload137; CHECK-NEXT: ldr p9, [sp, #10, mul vl] // 2-byte Reload138; CHECK-NEXT: ldr p8, [sp, #11, mul vl] // 2-byte Reload139; CHECK-NEXT: ldr p7, [sp, #12, mul vl] // 2-byte Reload140; CHECK-NEXT: ldr p6, [sp, #13, mul vl] // 2-byte Reload141; CHECK-NEXT: ldr p5, [sp, #14, mul vl] // 2-byte Reload142; CHECK-NEXT: ldr p4, [sp, #15, mul vl] // 2-byte Reload143; CHECK-NEXT: addvl sp, sp, #18144; CHECK-NEXT: .cfi_def_cfa wsp, 16145; CHECK-NEXT: .cfi_restore z8146; CHECK-NEXT: .cfi_restore z9147; CHECK-NEXT: .cfi_restore z10148; CHECK-NEXT: .cfi_restore z11149; CHECK-NEXT: .cfi_restore z12150; CHECK-NEXT: .cfi_restore z13151; CHECK-NEXT: .cfi_restore z14152; CHECK-NEXT: .cfi_restore z15153; CHECK-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload154; CHECK-NEXT: .cfi_def_cfa_offset 0155; CHECK-NEXT: .cfi_restore w30156; CHECK-NEXT: .cfi_restore w29157; CHECK-NEXT: ret158;159; GISEL-LABEL: invoke_callee_may_throw_sve:160; GISEL: .Lfunc_begin0:161; GISEL-NEXT: .cfi_startproc162; GISEL-NEXT: // %bb.0:163; GISEL-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill164; GISEL-NEXT: .cfi_def_cfa_offset 16165; GISEL-NEXT: .cfi_offset w30, -8166; GISEL-NEXT: .cfi_offset w29, -16167; GISEL-NEXT: addvl sp, sp, #-18168; GISEL-NEXT: .cfi_escape 0x0f, 0x0a, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x11, 0x90, 0x01, 0x1e, 0x22 // sp + 16 + 144 * VG169; GISEL-NEXT: str p15, [sp, #4, mul vl] // 2-byte Spill170; GISEL-NEXT: str p14, [sp, #5, mul vl] // 2-byte Spill171; GISEL-NEXT: str p13, [sp, #6, mul vl] // 2-byte Spill172; GISEL-NEXT: str p12, [sp, #7, mul vl] // 2-byte Spill173; GISEL-NEXT: str p11, [sp, #8, mul vl] // 2-byte Spill174; GISEL-NEXT: str p10, [sp, #9, mul vl] // 2-byte Spill175; GISEL-NEXT: str p9, [sp, #10, mul vl] // 2-byte Spill176; GISEL-NEXT: str p8, [sp, #11, mul vl] // 2-byte Spill177; GISEL-NEXT: str p7, [sp, #12, mul vl] // 2-byte Spill178; GISEL-NEXT: str p6, [sp, #13, mul vl] // 2-byte Spill179; GISEL-NEXT: str p5, [sp, #14, mul vl] // 2-byte Spill180; GISEL-NEXT: str p4, [sp, #15, mul vl] // 2-byte Spill181; GISEL-NEXT: str z23, [sp, #2, mul vl] // 16-byte Folded Spill182; GISEL-NEXT: str z22, [sp, #3, mul vl] // 16-byte Folded Spill183; GISEL-NEXT: str z21, [sp, #4, mul vl] // 16-byte Folded Spill184; GISEL-NEXT: str z20, [sp, #5, mul vl] // 16-byte Folded Spill185; GISEL-NEXT: str z19, [sp, #6, mul vl] // 16-byte Folded Spill186; GISEL-NEXT: str z18, [sp, #7, mul vl] // 16-byte Folded Spill187; GISEL-NEXT: str z17, [sp, #8, mul vl] // 16-byte Folded Spill188; GISEL-NEXT: str z16, [sp, #9, mul vl] // 16-byte Folded Spill189; GISEL-NEXT: str z15, [sp, #10, mul vl] // 16-byte Folded Spill190; GISEL-NEXT: str z14, [sp, #11, mul vl] // 16-byte Folded Spill191; GISEL-NEXT: str z13, [sp, #12, mul vl] // 16-byte Folded Spill192; GISEL-NEXT: str z12, [sp, #13, mul vl] // 16-byte Folded Spill193; GISEL-NEXT: str z11, [sp, #14, mul vl] // 16-byte Folded Spill194; GISEL-NEXT: str z10, [sp, #15, mul vl] // 16-byte Folded Spill195; GISEL-NEXT: str z9, [sp, #16, mul vl] // 16-byte Folded Spill196; GISEL-NEXT: str z8, [sp, #17, mul vl] // 16-byte Folded Spill197; GISEL-NEXT: .cfi_escape 0x10, 0x48, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x78, 0x1e, 0x22, 0x40, 0x1c // $d8 @ cfa - 8 * VG - 16198; GISEL-NEXT: .cfi_escape 0x10, 0x49, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x70, 0x1e, 0x22, 0x40, 0x1c // $d9 @ cfa - 16 * VG - 16199; GISEL-NEXT: .cfi_escape 0x10, 0x4a, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x68, 0x1e, 0x22, 0x40, 0x1c // $d10 @ cfa - 24 * VG - 16200; GISEL-NEXT: .cfi_escape 0x10, 0x4b, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x60, 0x1e, 0x22, 0x40, 0x1c // $d11 @ cfa - 32 * VG - 16201; GISEL-NEXT: .cfi_escape 0x10, 0x4c, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x58, 0x1e, 0x22, 0x40, 0x1c // $d12 @ cfa - 40 * VG - 16202; GISEL-NEXT: .cfi_escape 0x10, 0x4d, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x50, 0x1e, 0x22, 0x40, 0x1c // $d13 @ cfa - 48 * VG - 16203; GISEL-NEXT: .cfi_escape 0x10, 0x4e, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x48, 0x1e, 0x22, 0x40, 0x1c // $d14 @ cfa - 56 * VG - 16204; GISEL-NEXT: .cfi_escape 0x10, 0x4f, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x40, 0x1e, 0x22, 0x40, 0x1c // $d15 @ cfa - 64 * VG - 16205; GISEL-NEXT: addvl sp, sp, #-2206; GISEL-NEXT: .cfi_escape 0x0f, 0x0a, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x11, 0xa0, 0x01, 0x1e, 0x22 // sp + 16 + 160 * VG207; GISEL-NEXT: .cfi_remember_state208; GISEL-NEXT: str z0, [sp] // 16-byte Folded Spill209; GISEL-NEXT: .Ltmp0: // EH_LABEL210; GISEL-NEXT: bl may_throw_sve211; GISEL-NEXT: .Ltmp1: // EH_LABEL212; GISEL-NEXT: str z0, [sp, #1, mul vl] // 16-byte Folded Spill213; GISEL-NEXT: b .LBB0_1214; GISEL-NEXT: .LBB0_1: // %.Lcontinue215; GISEL-NEXT: ldr z0, [sp, #1, mul vl] // 16-byte Folded Reload216; GISEL-NEXT: addvl sp, sp, #2217; GISEL-NEXT: .cfi_escape 0x0f, 0x0a, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x11, 0x90, 0x01, 0x1e, 0x22 // sp + 16 + 144 * VG218; GISEL-NEXT: ldr z23, [sp, #2, mul vl] // 16-byte Folded Reload219; GISEL-NEXT: ldr z22, [sp, #3, mul vl] // 16-byte Folded Reload220; GISEL-NEXT: ldr z21, [sp, #4, mul vl] // 16-byte Folded Reload221; GISEL-NEXT: ldr z20, [sp, #5, mul vl] // 16-byte Folded Reload222; GISEL-NEXT: ldr z19, [sp, #6, mul vl] // 16-byte Folded Reload223; GISEL-NEXT: ldr z18, [sp, #7, mul vl] // 16-byte Folded Reload224; GISEL-NEXT: ldr z17, [sp, #8, mul vl] // 16-byte Folded Reload225; GISEL-NEXT: ldr z16, [sp, #9, mul vl] // 16-byte Folded Reload226; GISEL-NEXT: ldr z15, [sp, #10, mul vl] // 16-byte Folded Reload227; GISEL-NEXT: ldr z14, [sp, #11, mul vl] // 16-byte Folded Reload228; GISEL-NEXT: ldr z13, [sp, #12, mul vl] // 16-byte Folded Reload229; GISEL-NEXT: ldr z12, [sp, #13, mul vl] // 16-byte Folded Reload230; GISEL-NEXT: ldr z11, [sp, #14, mul vl] // 16-byte Folded Reload231; GISEL-NEXT: ldr z10, [sp, #15, mul vl] // 16-byte Folded Reload232; GISEL-NEXT: ldr z9, [sp, #16, mul vl] // 16-byte Folded Reload233; GISEL-NEXT: ldr z8, [sp, #17, mul vl] // 16-byte Folded Reload234; GISEL-NEXT: ldr p15, [sp, #4, mul vl] // 2-byte Reload235; GISEL-NEXT: ldr p14, [sp, #5, mul vl] // 2-byte Reload236; GISEL-NEXT: ldr p13, [sp, #6, mul vl] // 2-byte Reload237; GISEL-NEXT: ldr p12, [sp, #7, mul vl] // 2-byte Reload238; GISEL-NEXT: ldr p11, [sp, #8, mul vl] // 2-byte Reload239; GISEL-NEXT: ldr p10, [sp, #9, mul vl] // 2-byte Reload240; GISEL-NEXT: ldr p9, [sp, #10, mul vl] // 2-byte Reload241; GISEL-NEXT: ldr p8, [sp, #11, mul vl] // 2-byte Reload242; GISEL-NEXT: ldr p7, [sp, #12, mul vl] // 2-byte Reload243; GISEL-NEXT: ldr p6, [sp, #13, mul vl] // 2-byte Reload244; GISEL-NEXT: ldr p5, [sp, #14, mul vl] // 2-byte Reload245; GISEL-NEXT: ldr p4, [sp, #15, mul vl] // 2-byte Reload246; GISEL-NEXT: addvl sp, sp, #18247; GISEL-NEXT: .cfi_def_cfa wsp, 16248; GISEL-NEXT: .cfi_restore z8249; GISEL-NEXT: .cfi_restore z9250; GISEL-NEXT: .cfi_restore z10251; GISEL-NEXT: .cfi_restore z11252; GISEL-NEXT: .cfi_restore z12253; GISEL-NEXT: .cfi_restore z13254; GISEL-NEXT: .cfi_restore z14255; GISEL-NEXT: .cfi_restore z15256; GISEL-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload257; GISEL-NEXT: .cfi_def_cfa_offset 0258; GISEL-NEXT: .cfi_restore w30259; GISEL-NEXT: .cfi_restore w29260; GISEL-NEXT: ret261; GISEL-NEXT: .LBB0_2: // %.Lunwind262; GISEL-NEXT: .cfi_restore_state263; GISEL-NEXT: .Ltmp2: // EH_LABEL264; GISEL-NEXT: ldr z0, [sp] // 16-byte Folded Reload265; GISEL-NEXT: addvl sp, sp, #2266; GISEL-NEXT: .cfi_escape 0x0f, 0x0a, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x11, 0x90, 0x01, 0x1e, 0x22 // sp + 16 + 144 * VG267; GISEL-NEXT: ldr z23, [sp, #2, mul vl] // 16-byte Folded Reload268; GISEL-NEXT: ldr z22, [sp, #3, mul vl] // 16-byte Folded Reload269; GISEL-NEXT: ldr z21, [sp, #4, mul vl] // 16-byte Folded Reload270; GISEL-NEXT: ldr z20, [sp, #5, mul vl] // 16-byte Folded Reload271; GISEL-NEXT: ldr z19, [sp, #6, mul vl] // 16-byte Folded Reload272; GISEL-NEXT: ldr z18, [sp, #7, mul vl] // 16-byte Folded Reload273; GISEL-NEXT: ldr z17, [sp, #8, mul vl] // 16-byte Folded Reload274; GISEL-NEXT: ldr z16, [sp, #9, mul vl] // 16-byte Folded Reload275; GISEL-NEXT: ldr z15, [sp, #10, mul vl] // 16-byte Folded Reload276; GISEL-NEXT: ldr z14, [sp, #11, mul vl] // 16-byte Folded Reload277; GISEL-NEXT: ldr z13, [sp, #12, mul vl] // 16-byte Folded Reload278; GISEL-NEXT: ldr z12, [sp, #13, mul vl] // 16-byte Folded Reload279; GISEL-NEXT: ldr z11, [sp, #14, mul vl] // 16-byte Folded Reload280; GISEL-NEXT: ldr z10, [sp, #15, mul vl] // 16-byte Folded Reload281; GISEL-NEXT: ldr z9, [sp, #16, mul vl] // 16-byte Folded Reload282; GISEL-NEXT: ldr z8, [sp, #17, mul vl] // 16-byte Folded Reload283; GISEL-NEXT: ldr p15, [sp, #4, mul vl] // 2-byte Reload284; GISEL-NEXT: ldr p14, [sp, #5, mul vl] // 2-byte Reload285; GISEL-NEXT: ldr p13, [sp, #6, mul vl] // 2-byte Reload286; GISEL-NEXT: ldr p12, [sp, #7, mul vl] // 2-byte Reload287; GISEL-NEXT: ldr p11, [sp, #8, mul vl] // 2-byte Reload288; GISEL-NEXT: ldr p10, [sp, #9, mul vl] // 2-byte Reload289; GISEL-NEXT: ldr p9, [sp, #10, mul vl] // 2-byte Reload290; GISEL-NEXT: ldr p8, [sp, #11, mul vl] // 2-byte Reload291; GISEL-NEXT: ldr p7, [sp, #12, mul vl] // 2-byte Reload292; GISEL-NEXT: ldr p6, [sp, #13, mul vl] // 2-byte Reload293; GISEL-NEXT: ldr p5, [sp, #14, mul vl] // 2-byte Reload294; GISEL-NEXT: ldr p4, [sp, #15, mul vl] // 2-byte Reload295; GISEL-NEXT: addvl sp, sp, #18296; GISEL-NEXT: .cfi_def_cfa wsp, 16297; GISEL-NEXT: .cfi_restore z8298; GISEL-NEXT: .cfi_restore z9299; GISEL-NEXT: .cfi_restore z10300; GISEL-NEXT: .cfi_restore z11301; GISEL-NEXT: .cfi_restore z12302; GISEL-NEXT: .cfi_restore z13303; GISEL-NEXT: .cfi_restore z14304; GISEL-NEXT: .cfi_restore z15305; GISEL-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload306; GISEL-NEXT: .cfi_def_cfa_offset 0307; GISEL-NEXT: .cfi_restore w30308; GISEL-NEXT: .cfi_restore w29309; GISEL-NEXT: ret310 %result = invoke <vscale x 4 x i32> @may_throw_sve(<vscale x 4 x i32> %v) to label %.Lcontinue unwind label %.Lunwind311.Lcontinue:312 ret <vscale x 4 x i32> %result313.Lunwind:314 %lp = landingpad { ptr, i32 } cleanup315 ret <vscale x 4 x i32> %v;316}317 318declare <vscale x 4 x i32> @may_throw_sve(<vscale x 4 x i32> %v);319 320 321; Test that q0 is saved/restored, as the unwinder may only retain the low 64bits (d0).322define aarch64_vector_pcs <4 x i32> @invoke_callee_may_throw_neon(<4 x i32> %v) uwtable personality i8 0 {323; CHECK-LABEL: invoke_callee_may_throw_neon:324; CHECK: .Lfunc_begin1:325; CHECK-NEXT: .cfi_startproc326; CHECK-NEXT: // %bb.0:327; CHECK-NEXT: sub sp, sp, #304328; CHECK-NEXT: .cfi_def_cfa_offset 304329; CHECK-NEXT: stp q23, q22, [sp, #32] // 32-byte Folded Spill330; CHECK-NEXT: stp q21, q20, [sp, #64] // 32-byte Folded Spill331; CHECK-NEXT: stp q19, q18, [sp, #96] // 32-byte Folded Spill332; CHECK-NEXT: stp q17, q16, [sp, #128] // 32-byte Folded Spill333; CHECK-NEXT: stp q15, q14, [sp, #160] // 32-byte Folded Spill334; CHECK-NEXT: stp q13, q12, [sp, #192] // 32-byte Folded Spill335; CHECK-NEXT: stp q11, q10, [sp, #224] // 32-byte Folded Spill336; CHECK-NEXT: stp q9, q8, [sp, #256] // 32-byte Folded Spill337; CHECK-NEXT: stp x29, x30, [sp, #288] // 16-byte Folded Spill338; CHECK-NEXT: .cfi_offset w30, -8339; CHECK-NEXT: .cfi_offset w29, -16340; CHECK-NEXT: .cfi_offset b8, -32341; CHECK-NEXT: .cfi_offset b9, -48342; CHECK-NEXT: .cfi_offset b10, -64343; CHECK-NEXT: .cfi_offset b11, -80344; CHECK-NEXT: .cfi_offset b12, -96345; CHECK-NEXT: .cfi_offset b13, -112346; CHECK-NEXT: .cfi_offset b14, -128347; CHECK-NEXT: .cfi_offset b15, -144348; CHECK-NEXT: .cfi_offset b16, -160349; CHECK-NEXT: .cfi_offset b17, -176350; CHECK-NEXT: .cfi_offset b18, -192351; CHECK-NEXT: .cfi_offset b19, -208352; CHECK-NEXT: .cfi_offset b20, -224353; CHECK-NEXT: .cfi_offset b21, -240354; CHECK-NEXT: .cfi_offset b22, -256355; CHECK-NEXT: .cfi_offset b23, -272356; CHECK-NEXT: .cfi_remember_state357; CHECK-NEXT: str q0, [sp] // 16-byte Spill358; CHECK-NEXT: .Ltmp3: // EH_LABEL359; CHECK-NEXT: bl may_throw_neon360; CHECK-NEXT: .Ltmp4: // EH_LABEL361; CHECK-NEXT: str q0, [sp, #16] // 16-byte Spill362; CHECK-NEXT: b .LBB1_1363; CHECK-NEXT: .LBB1_1: // %.Lcontinue364; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload365; CHECK-NEXT: ldp x29, x30, [sp, #288] // 16-byte Folded Reload366; CHECK-NEXT: ldp q9, q8, [sp, #256] // 32-byte Folded Reload367; CHECK-NEXT: ldp q11, q10, [sp, #224] // 32-byte Folded Reload368; CHECK-NEXT: ldp q13, q12, [sp, #192] // 32-byte Folded Reload369; CHECK-NEXT: ldp q15, q14, [sp, #160] // 32-byte Folded Reload370; CHECK-NEXT: ldp q17, q16, [sp, #128] // 32-byte Folded Reload371; CHECK-NEXT: ldp q19, q18, [sp, #96] // 32-byte Folded Reload372; CHECK-NEXT: ldp q21, q20, [sp, #64] // 32-byte Folded Reload373; CHECK-NEXT: ldp q23, q22, [sp, #32] // 32-byte Folded Reload374; CHECK-NEXT: add sp, sp, #304375; CHECK-NEXT: .cfi_def_cfa_offset 0376; CHECK-NEXT: .cfi_restore w30377; CHECK-NEXT: .cfi_restore w29378; CHECK-NEXT: .cfi_restore b8379; CHECK-NEXT: .cfi_restore b9380; CHECK-NEXT: .cfi_restore b10381; CHECK-NEXT: .cfi_restore b11382; CHECK-NEXT: .cfi_restore b12383; CHECK-NEXT: .cfi_restore b13384; CHECK-NEXT: .cfi_restore b14385; CHECK-NEXT: .cfi_restore b15386; CHECK-NEXT: .cfi_restore b16387; CHECK-NEXT: .cfi_restore b17388; CHECK-NEXT: .cfi_restore b18389; CHECK-NEXT: .cfi_restore b19390; CHECK-NEXT: .cfi_restore b20391; CHECK-NEXT: .cfi_restore b21392; CHECK-NEXT: .cfi_restore b22393; CHECK-NEXT: .cfi_restore b23394; CHECK-NEXT: ret395; CHECK-NEXT: .LBB1_2: // %.Lunwind396; CHECK-NEXT: .cfi_restore_state397; CHECK-NEXT: .Ltmp5: // EH_LABEL398; CHECK-NEXT: ldr q0, [sp] // 16-byte Reload399; CHECK-NEXT: ldp x29, x30, [sp, #288] // 16-byte Folded Reload400; CHECK-NEXT: ldp q9, q8, [sp, #256] // 32-byte Folded Reload401; CHECK-NEXT: ldp q11, q10, [sp, #224] // 32-byte Folded Reload402; CHECK-NEXT: ldp q13, q12, [sp, #192] // 32-byte Folded Reload403; CHECK-NEXT: ldp q15, q14, [sp, #160] // 32-byte Folded Reload404; CHECK-NEXT: ldp q17, q16, [sp, #128] // 32-byte Folded Reload405; CHECK-NEXT: ldp q19, q18, [sp, #96] // 32-byte Folded Reload406; CHECK-NEXT: ldp q21, q20, [sp, #64] // 32-byte Folded Reload407; CHECK-NEXT: ldp q23, q22, [sp, #32] // 32-byte Folded Reload408; CHECK-NEXT: add sp, sp, #304409; CHECK-NEXT: .cfi_def_cfa_offset 0410; CHECK-NEXT: .cfi_restore w30411; CHECK-NEXT: .cfi_restore w29412; CHECK-NEXT: .cfi_restore b8413; CHECK-NEXT: .cfi_restore b9414; CHECK-NEXT: .cfi_restore b10415; CHECK-NEXT: .cfi_restore b11416; CHECK-NEXT: .cfi_restore b12417; CHECK-NEXT: .cfi_restore b13418; CHECK-NEXT: .cfi_restore b14419; CHECK-NEXT: .cfi_restore b15420; CHECK-NEXT: .cfi_restore b16421; CHECK-NEXT: .cfi_restore b17422; CHECK-NEXT: .cfi_restore b18423; CHECK-NEXT: .cfi_restore b19424; CHECK-NEXT: .cfi_restore b20425; CHECK-NEXT: .cfi_restore b21426; CHECK-NEXT: .cfi_restore b22427; CHECK-NEXT: .cfi_restore b23428; CHECK-NEXT: ret429;430; GISEL-LABEL: invoke_callee_may_throw_neon:431; GISEL: .Lfunc_begin1:432; GISEL-NEXT: .cfi_startproc433; GISEL-NEXT: // %bb.0:434; GISEL-NEXT: sub sp, sp, #304435; GISEL-NEXT: .cfi_def_cfa_offset 304436; GISEL-NEXT: stp q23, q22, [sp, #32] // 32-byte Folded Spill437; GISEL-NEXT: stp q21, q20, [sp, #64] // 32-byte Folded Spill438; GISEL-NEXT: stp q19, q18, [sp, #96] // 32-byte Folded Spill439; GISEL-NEXT: stp q17, q16, [sp, #128] // 32-byte Folded Spill440; GISEL-NEXT: stp q15, q14, [sp, #160] // 32-byte Folded Spill441; GISEL-NEXT: stp q13, q12, [sp, #192] // 32-byte Folded Spill442; GISEL-NEXT: stp q11, q10, [sp, #224] // 32-byte Folded Spill443; GISEL-NEXT: stp q9, q8, [sp, #256] // 32-byte Folded Spill444; GISEL-NEXT: stp x29, x30, [sp, #288] // 16-byte Folded Spill445; GISEL-NEXT: .cfi_offset w30, -8446; GISEL-NEXT: .cfi_offset w29, -16447; GISEL-NEXT: .cfi_offset b8, -32448; GISEL-NEXT: .cfi_offset b9, -48449; GISEL-NEXT: .cfi_offset b10, -64450; GISEL-NEXT: .cfi_offset b11, -80451; GISEL-NEXT: .cfi_offset b12, -96452; GISEL-NEXT: .cfi_offset b13, -112453; GISEL-NEXT: .cfi_offset b14, -128454; GISEL-NEXT: .cfi_offset b15, -144455; GISEL-NEXT: .cfi_offset b16, -160456; GISEL-NEXT: .cfi_offset b17, -176457; GISEL-NEXT: .cfi_offset b18, -192458; GISEL-NEXT: .cfi_offset b19, -208459; GISEL-NEXT: .cfi_offset b20, -224460; GISEL-NEXT: .cfi_offset b21, -240461; GISEL-NEXT: .cfi_offset b22, -256462; GISEL-NEXT: .cfi_offset b23, -272463; GISEL-NEXT: .cfi_remember_state464; GISEL-NEXT: str q0, [sp] // 16-byte Spill465; GISEL-NEXT: .Ltmp3: // EH_LABEL466; GISEL-NEXT: bl may_throw_neon467; GISEL-NEXT: str q0, [sp, #16] // 16-byte Spill468; GISEL-NEXT: .Ltmp4: // EH_LABEL469; GISEL-NEXT: b .LBB1_1470; GISEL-NEXT: .LBB1_1: // %.Lcontinue471; GISEL-NEXT: ldr q0, [sp, #16] // 16-byte Reload472; GISEL-NEXT: ldp x29, x30, [sp, #288] // 16-byte Folded Reload473; GISEL-NEXT: ldp q9, q8, [sp, #256] // 32-byte Folded Reload474; GISEL-NEXT: ldp q11, q10, [sp, #224] // 32-byte Folded Reload475; GISEL-NEXT: ldp q13, q12, [sp, #192] // 32-byte Folded Reload476; GISEL-NEXT: ldp q15, q14, [sp, #160] // 32-byte Folded Reload477; GISEL-NEXT: ldp q17, q16, [sp, #128] // 32-byte Folded Reload478; GISEL-NEXT: ldp q19, q18, [sp, #96] // 32-byte Folded Reload479; GISEL-NEXT: ldp q21, q20, [sp, #64] // 32-byte Folded Reload480; GISEL-NEXT: ldp q23, q22, [sp, #32] // 32-byte Folded Reload481; GISEL-NEXT: add sp, sp, #304482; GISEL-NEXT: .cfi_def_cfa_offset 0483; GISEL-NEXT: .cfi_restore w30484; GISEL-NEXT: .cfi_restore w29485; GISEL-NEXT: .cfi_restore b8486; GISEL-NEXT: .cfi_restore b9487; GISEL-NEXT: .cfi_restore b10488; GISEL-NEXT: .cfi_restore b11489; GISEL-NEXT: .cfi_restore b12490; GISEL-NEXT: .cfi_restore b13491; GISEL-NEXT: .cfi_restore b14492; GISEL-NEXT: .cfi_restore b15493; GISEL-NEXT: .cfi_restore b16494; GISEL-NEXT: .cfi_restore b17495; GISEL-NEXT: .cfi_restore b18496; GISEL-NEXT: .cfi_restore b19497; GISEL-NEXT: .cfi_restore b20498; GISEL-NEXT: .cfi_restore b21499; GISEL-NEXT: .cfi_restore b22500; GISEL-NEXT: .cfi_restore b23501; GISEL-NEXT: ret502; GISEL-NEXT: .LBB1_2: // %.Lunwind503; GISEL-NEXT: .cfi_restore_state504; GISEL-NEXT: .Ltmp5: // EH_LABEL505; GISEL-NEXT: ldr q0, [sp] // 16-byte Reload506; GISEL-NEXT: ldp x29, x30, [sp, #288] // 16-byte Folded Reload507; GISEL-NEXT: ldp q9, q8, [sp, #256] // 32-byte Folded Reload508; GISEL-NEXT: ldp q11, q10, [sp, #224] // 32-byte Folded Reload509; GISEL-NEXT: ldp q13, q12, [sp, #192] // 32-byte Folded Reload510; GISEL-NEXT: ldp q15, q14, [sp, #160] // 32-byte Folded Reload511; GISEL-NEXT: ldp q17, q16, [sp, #128] // 32-byte Folded Reload512; GISEL-NEXT: ldp q19, q18, [sp, #96] // 32-byte Folded Reload513; GISEL-NEXT: ldp q21, q20, [sp, #64] // 32-byte Folded Reload514; GISEL-NEXT: ldp q23, q22, [sp, #32] // 32-byte Folded Reload515; GISEL-NEXT: add sp, sp, #304516; GISEL-NEXT: .cfi_def_cfa_offset 0517; GISEL-NEXT: .cfi_restore w30518; GISEL-NEXT: .cfi_restore w29519; GISEL-NEXT: .cfi_restore b8520; GISEL-NEXT: .cfi_restore b9521; GISEL-NEXT: .cfi_restore b10522; GISEL-NEXT: .cfi_restore b11523; GISEL-NEXT: .cfi_restore b12524; GISEL-NEXT: .cfi_restore b13525; GISEL-NEXT: .cfi_restore b14526; GISEL-NEXT: .cfi_restore b15527; GISEL-NEXT: .cfi_restore b16528; GISEL-NEXT: .cfi_restore b17529; GISEL-NEXT: .cfi_restore b18530; GISEL-NEXT: .cfi_restore b19531; GISEL-NEXT: .cfi_restore b20532; GISEL-NEXT: .cfi_restore b21533; GISEL-NEXT: .cfi_restore b22534; GISEL-NEXT: .cfi_restore b23535; GISEL-NEXT: ret536 %result = invoke aarch64_vector_pcs <4 x i32> @may_throw_neon(<4 x i32> %v) to label %.Lcontinue unwind label %.Lunwind537.Lcontinue:538 ret <4 x i32> %result539.Lunwind:540 %lp = landingpad { ptr, i32 } cleanup541 ret <4 x i32> %v;542}543 544declare aarch64_vector_pcs <4 x i32> @may_throw_neon(<4 x i32> %v);545