454 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; RUN: opt -mtriple=aarch64-unknown-linux-gnu -mattr=+sme -S -passes=inline < %s | FileCheck %s3 4declare void @inlined_body()5 6;7; Define some functions that will be called by the functions below.8; These just call a '...body()' function. If we see the call to one of9; these functions being replaced by '...body()', then we know it has been10; inlined.11;12 13define void @nonza_callee() {14; CHECK-LABEL: define void @nonza_callee15; CHECK-SAME: () #[[ATTR0:[0-9]+]] {16; CHECK-NEXT: entry:17; CHECK-NEXT: call void asm sideeffect "18; CHECK-NEXT: call void @inlined_body()19; CHECK-NEXT: ret void20;21entry:22 call void asm sideeffect "; inlineasm", ""()23 call void @inlined_body()24 ret void25}26 27define void @shared_za_callee() "aarch64_inout_za" {28; CHECK-LABEL: define void @shared_za_callee29; CHECK-SAME: () #[[ATTR1:[0-9]+]] {30; CHECK-NEXT: entry:31; CHECK-NEXT: call void asm sideeffect "32; CHECK-NEXT: call void @inlined_body()33; CHECK-NEXT: ret void34;35entry:36 call void asm sideeffect "; inlineasm", ""()37 call void @inlined_body()38 ret void39}40 41define void @new_za_callee() "aarch64_new_za" {42; CHECK-LABEL: define void @new_za_callee43; CHECK-SAME: () #[[ATTR2:[0-9]+]] {44; CHECK-NEXT: call void asm sideeffect "45; CHECK-NEXT: call void @inlined_body()46; CHECK-NEXT: ret void47;48 call void asm sideeffect "; inlineasm", ""()49 call void @inlined_body()50 ret void51}52 53define void @agnostic_za_callee() "aarch64_za_state_agnostic" {54; CHECK-LABEL: define void @agnostic_za_callee55; CHECK-SAME: () #[[ATTR3:[0-9]+]] {56; CHECK-NEXT: call void asm sideeffect "57; CHECK-NEXT: call void @inlined_body()58; CHECK-NEXT: ret void59;60 call void asm sideeffect "; inlineasm", ""()61 call void @inlined_body()62 ret void63}64 65;66; Now test that inlining only happens when no lazy-save is needed.67; Test for a number of combinations, where:68; N Not using ZA.69; S Shared ZA interface70; Z New ZA with Private-ZA interface71; A Agnostic ZA interface72 73; [x] N -> N74; [ ] N -> S (This combination is invalid)75; [ ] N -> Z76; [ ] N -> A77define void @nonza_caller_nonza_callee_inline() {78; CHECK-LABEL: define void @nonza_caller_nonza_callee_inline79; CHECK-SAME: () #[[ATTR0]] {80; CHECK-NEXT: entry:81; CHECK-NEXT: call void asm sideeffect "82; CHECK-NEXT: call void @inlined_body()83; CHECK-NEXT: ret void84;85entry:86 call void @nonza_callee()87 ret void88}89 90; [ ] N -> N91; [ ] N -> S (This combination is invalid)92; [x] N -> Z93; [ ] N -> A94define void @nonza_caller_new_za_callee_dont_inline() {95; CHECK-LABEL: define void @nonza_caller_new_za_callee_dont_inline96; CHECK-SAME: () #[[ATTR0]] {97; CHECK-NEXT: entry:98; CHECK-NEXT: call void @new_za_callee()99; CHECK-NEXT: ret void100;101entry:102 call void @new_za_callee()103 ret void104}105 106; [ ] N -> N107; [ ] N -> S (This combination is invalid)108; [ ] N -> Z109; [x] N -> A110define void @nonza_caller_agnostic_za_callee_inline() {111; CHECK-LABEL: define void @nonza_caller_agnostic_za_callee_inline112; CHECK-SAME: () #[[ATTR0]] {113; CHECK-NEXT: entry:114; CHECK-NEXT: call void asm sideeffect "115; CHECK-NEXT: call void @inlined_body()116; CHECK-NEXT: ret void117;118entry:119 call void @agnostic_za_callee()120 ret void121}122 123; [x] Z -> N124; [ ] Z -> S125; [ ] Z -> Z126; [ ] Z -> A127define void @new_za_caller_nonza_callee_dont_inline() "aarch64_new_za" {128; CHECK-LABEL: define void @new_za_caller_nonza_callee_dont_inline129; CHECK-SAME: () #[[ATTR2]] {130; CHECK-NEXT: entry:131; CHECK-NEXT: call void @nonza_callee()132; CHECK-NEXT: ret void133;134entry:135 call void @nonza_callee()136 ret void137}138 139; [ ] Z -> N140; [x] Z -> S141; [ ] Z -> Z142; [ ] Z -> A143define void @new_za_caller_shared_za_callee_inline() "aarch64_new_za" {144; CHECK-LABEL: define void @new_za_caller_shared_za_callee_inline145; CHECK-SAME: () #[[ATTR2]] {146; CHECK-NEXT: entry:147; CHECK-NEXT: call void asm sideeffect "148; CHECK-NEXT: call void @inlined_body()149; CHECK-NEXT: ret void150;151entry:152 call void @shared_za_callee()153 ret void154}155 156; [ ] Z -> N157; [ ] Z -> S158; [x] Z -> Z159; [ ] Z -> A160define void @new_za_caller_new_za_callee_dont_inline() "aarch64_new_za" {161; CHECK-LABEL: define void @new_za_caller_new_za_callee_dont_inline162; CHECK-SAME: () #[[ATTR2]] {163; CHECK-NEXT: entry:164; CHECK-NEXT: call void @new_za_callee()165; CHECK-NEXT: ret void166;167entry:168 call void @new_za_callee()169 ret void170}171 172; [ ] Z -> N173; [ ] Z -> S174; [ ] Z -> Z175; [x] Z -> A176define void @new_za_caller_agnostic_za_callee_inline() "aarch64_new_za" {177; CHECK-LABEL: define void @new_za_caller_agnostic_za_callee_inline178; CHECK-SAME: () #[[ATTR2]] {179; CHECK-NEXT: entry:180; CHECK-NEXT: call void asm sideeffect "181; CHECK-NEXT: call void @inlined_body()182; CHECK-NEXT: ret void183;184entry:185 call void @agnostic_za_callee()186 ret void187}188 189; [x] S -> N190; [ ] S -> S191; [ ] S -> Z192; [ ] S -> A193define void @shared_za_caller_nonza_callee_dont_inline() "aarch64_inout_za" {194; CHECK-LABEL: define void @shared_za_caller_nonza_callee_dont_inline195; CHECK-SAME: () #[[ATTR1]] {196; CHECK-NEXT: entry:197; CHECK-NEXT: call void @nonza_callee()198; CHECK-NEXT: ret void199;200entry:201 call void @nonza_callee()202 ret void203}204 205; [ ] S -> N206; [x] S -> Z207; [ ] S -> S208; [ ] S -> A209define void @shared_za_caller_new_za_callee_dont_inline() "aarch64_inout_za" {210; CHECK-LABEL: define void @shared_za_caller_new_za_callee_dont_inline211; CHECK-SAME: () #[[ATTR1]] {212; CHECK-NEXT: entry:213; CHECK-NEXT: call void @new_za_callee()214; CHECK-NEXT: ret void215;216entry:217 call void @new_za_callee()218 ret void219}220 221; [ ] S -> N222; [ ] S -> Z223; [x] S -> S224; [ ] S -> A225define void @shared_za_caller_shared_za_callee_inline() "aarch64_inout_za" {226; CHECK-LABEL: define void @shared_za_caller_shared_za_callee_inline227; CHECK-SAME: () #[[ATTR1]] {228; CHECK-NEXT: entry:229; CHECK-NEXT: call void asm sideeffect "230; CHECK-NEXT: call void @inlined_body()231; CHECK-NEXT: ret void232;233entry:234 call void @shared_za_callee()235 ret void236}237 238; [ ] S -> N239; [ ] S -> Z240; [ ] S -> S241; [x] S -> A242define void @shared_za_caller_agnostic_za_callee_inline() "aarch64_inout_za" {243; CHECK-LABEL: define void @shared_za_caller_agnostic_za_callee_inline244; CHECK-SAME: () #[[ATTR1]] {245; CHECK-NEXT: entry:246; CHECK-NEXT: call void asm sideeffect "247; CHECK-NEXT: call void @inlined_body()248; CHECK-NEXT: ret void249;250entry:251 call void @agnostic_za_callee()252 ret void253}254 255; [x] A -> N256; [ ] A -> Z257; [ ] A -> S258; [ ] A -> A259define void @agnostic_za_caller_nonza_callee_dont_inline() "aarch64_za_state_agnostic" {260; CHECK-LABEL: define void @agnostic_za_caller_nonza_callee_dont_inline261; CHECK-SAME: () #[[ATTR3]] {262; CHECK-NEXT: entry:263; CHECK-NEXT: call void @nonza_callee()264; CHECK-NEXT: ret void265;266entry:267 call void @nonza_callee()268 ret void269}270 271; [ ] A -> N272; [x] A -> Z273; [ ] A -> S274; [ ] A -> A275define void @agnostic_za_caller_new_za_callee_dont_inline() "aarch64_za_state_agnostic" {276; CHECK-LABEL: define void @agnostic_za_caller_new_za_callee_dont_inline277; CHECK-SAME: () #[[ATTR3]] {278; CHECK-NEXT: entry:279; CHECK-NEXT: call void @new_za_callee()280; CHECK-NEXT: ret void281;282entry:283 call void @new_za_callee()284 ret void285}286 287; [ ] A -> N288; [ ] A -> Z289; [x] A -> S (invalid)290; [ ] A -> A291define void @agnostic_za_caller_shared_za_callee_dont_inline() "aarch64_za_state_agnostic" {292; CHECK-LABEL: define void @agnostic_za_caller_shared_za_callee_dont_inline293; CHECK-SAME: () #[[ATTR3]] {294; CHECK-NEXT: entry:295; CHECK-NEXT: call void @shared_za_callee()296; CHECK-NEXT: ret void297;298entry:299 call void @shared_za_callee()300 ret void301}302 303; [ ] A -> N304; [ ] A -> Z305; [ ] A -> S306; [x] A -> A307define void @agnostic_za_caller_agnostic_za_callee_inline() "aarch64_za_state_agnostic" {308; CHECK-LABEL: define void @agnostic_za_caller_agnostic_za_callee_inline309; CHECK-SAME: () #[[ATTR3]] {310; CHECK-NEXT: entry:311; CHECK-NEXT: call void asm sideeffect "312; CHECK-NEXT: call void @inlined_body()313; CHECK-NEXT: ret void314;315entry:316 call void @agnostic_za_callee()317 ret void318}319 320 321 322define void @private_za_callee_call_za_disable() {323; CHECK-LABEL: define void @private_za_callee_call_za_disable324; CHECK-SAME: () #[[ATTR0]] {325; CHECK-NEXT: call void @__arm_za_disable()326; CHECK-NEXT: ret void327;328 call void @__arm_za_disable()329 ret void330}331 332define void @shared_za_caller_private_za_callee_call_za_disable() "aarch64_inout_za" {333; CHECK-LABEL: define void @shared_za_caller_private_za_callee_call_za_disable334; CHECK-SAME: () #[[ATTR1]] {335; CHECK-NEXT: call void @private_za_callee_call_za_disable()336; CHECK-NEXT: ret void337;338 call void @private_za_callee_call_za_disable()339 ret void340}341 342define void @private_za_callee_call_tpidr2_save() {343; CHECK-LABEL: define void @private_za_callee_call_tpidr2_save344; CHECK-SAME: () #[[ATTR0]] {345; CHECK-NEXT: call void @__arm_tpidr2_save()346; CHECK-NEXT: ret void347;348 call void @__arm_tpidr2_save()349 ret void350}351 352define void @shared_za_caller_private_za_callee_call_tpidr2_save_dont_inline() "aarch64_inout_za" {353; CHECK-LABEL: define void @shared_za_caller_private_za_callee_call_tpidr2_save_dont_inline354; CHECK-SAME: () #[[ATTR1]] {355; CHECK-NEXT: call void @private_za_callee_call_tpidr2_save()356; CHECK-NEXT: ret void357;358 call void @private_za_callee_call_tpidr2_save()359 ret void360}361 362define void @private_za_callee_call_tpidr2_restore(ptr %ptr) {363; CHECK-LABEL: define void @private_za_callee_call_tpidr2_restore364; CHECK-SAME: (ptr [[PTR:%.*]]) #[[ATTR0]] {365; CHECK-NEXT: call void @__arm_tpidr2_restore(ptr [[PTR]])366; CHECK-NEXT: ret void367;368 call void @__arm_tpidr2_restore(ptr %ptr)369 ret void370}371 372define void @shared_za_caller_private_za_callee_call_tpidr2_restore_dont_inline(ptr %ptr) "aarch64_inout_za" {373; CHECK-LABEL: define void @shared_za_caller_private_za_callee_call_tpidr2_restore_dont_inline374; CHECK-SAME: (ptr [[PTR:%.*]]) #[[ATTR1]] {375; CHECK-NEXT: call void @private_za_callee_call_tpidr2_restore(ptr [[PTR]])376; CHECK-NEXT: ret void377;378 call void @private_za_callee_call_tpidr2_restore(ptr %ptr)379 ret void380}381 382define void @nonzt0_callee() {383; CHECK-LABEL: define void @nonzt0_callee384; CHECK-SAME: () #[[ATTR0]] {385; CHECK-NEXT: call void asm sideeffect "386; CHECK-NEXT: call void @inlined_body()387; CHECK-NEXT: ret void388;389 call void asm sideeffect "; inlineasm", ""()390 call void @inlined_body()391 ret void392}393 394define void @new_zt0_callee() "aarch64_new_zt0" {395; CHECK-LABEL: define void @new_zt0_callee396; CHECK-SAME: () #[[ATTR4:[0-9]+]] {397; CHECK-NEXT: call void asm sideeffect "398; CHECK-NEXT: call void @inlined_body()399; CHECK-NEXT: ret void400;401 call void asm sideeffect "; inlineasm", ""()402 call void @inlined_body()403 ret void404}405 406define void @nonzt0_caller_new_zt0_callee_dont_inline() {407; CHECK-LABEL: define void @nonzt0_caller_new_zt0_callee_dont_inline408; CHECK-SAME: () #[[ATTR0]] {409; CHECK-NEXT: entry:410; CHECK-NEXT: call void @new_zt0_callee()411; CHECK-NEXT: ret void412;413entry:414 call void @new_zt0_callee()415 ret void416}417 418define void @shared_zt0_caller_nonzt0_callee_dont_inline() "aarch64_inout_zt0" {419; CHECK-LABEL: define void @shared_zt0_caller_nonzt0_callee_dont_inline420; CHECK-SAME: () #[[ATTR5:[0-9]+]] {421; CHECK-NEXT: call void @nonzt0_callee()422; CHECK-NEXT: ret void423;424 call void @nonzt0_callee()425 ret void426}427 428define void @shared_zt0_callee() "aarch64_inout_zt0" {429; CHECK-LABEL: define void @shared_zt0_callee430; CHECK-SAME: () #[[ATTR5]] {431; CHECK-NEXT: call void asm sideeffect "432; CHECK-NEXT: call void @inlined_body()433; CHECK-NEXT: ret void434;435 call void asm sideeffect "; inlineasm", ""()436 call void @inlined_body()437 ret void438}439 440define void @shared_zt0_caller_shared_zt0_callee_inline() "aarch64_inout_zt0" {441; CHECK-LABEL: define void @shared_zt0_caller_shared_zt0_callee_inline442; CHECK-SAME: () #[[ATTR5]] {443; CHECK-NEXT: call void asm sideeffect "444; CHECK-NEXT: call void @inlined_body()445; CHECK-NEXT: ret void446;447 call void @shared_zt0_callee()448 ret void449}450 451declare void @__arm_za_disable()452declare void @__arm_tpidr2_save()453declare void @__arm_tpidr2_restore(ptr)454