179 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -O0 -mtriple=aarch64-linux-gnu -mattr=+sme -verify-machineinstrs < %s | FileCheck %s3; RUN: llc -O0 -mtriple=aarch64-linux-gnu -mattr=+sme -verify-machineinstrs -aarch64-new-sme-abi < %s | FileCheck %s --check-prefix=CHECK-NEWLOWERING4 5declare void @shared_za_callee() "aarch64_inout_za"6 7define void @private_za() "aarch64_new_za" {8; CHECK-LABEL: private_za:9; CHECK: // %bb.0: // %prelude10; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill11; CHECK-NEXT: .cfi_def_cfa_offset 1612; CHECK-NEXT: .cfi_offset w30, -1613; CHECK-NEXT: rdsvl x8, #114; CHECK-NEXT: mrs x8, TPIDR2_EL015; CHECK-NEXT: cbz x8, .LBB0_216; CHECK-NEXT: b .LBB0_117; CHECK-NEXT: .LBB0_1: // %save.za18; CHECK-NEXT: bl __arm_tpidr2_save19; CHECK-NEXT: mov x8, xzr20; CHECK-NEXT: msr TPIDR2_EL0, x821; CHECK-NEXT: b .LBB0_222; CHECK-NEXT: .LBB0_2:23; CHECK-NEXT: smstart za24; CHECK-NEXT: zero {za}25; CHECK-NEXT: bl shared_za_callee26; CHECK-NEXT: smstop za27; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload28; CHECK-NEXT: ret29;30; CHECK-NEWLOWERING-LABEL: private_za:31; CHECK-NEWLOWERING: // %bb.0:32; CHECK-NEWLOWERING-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill33; CHECK-NEWLOWERING-NEXT: .cfi_def_cfa_offset 1634; CHECK-NEWLOWERING-NEXT: .cfi_offset w30, -1635; CHECK-NEWLOWERING-NEXT: mrs x8, TPIDR2_EL036; CHECK-NEWLOWERING-NEXT: cbnz x8, .LBB0_137; CHECK-NEWLOWERING-NEXT: b .LBB0_238; CHECK-NEWLOWERING-NEXT: .LBB0_1:39; CHECK-NEWLOWERING-NEXT: bl __arm_tpidr2_save40; CHECK-NEWLOWERING-NEXT: msr TPIDR2_EL0, xzr41; CHECK-NEWLOWERING-NEXT: zero {za}42; CHECK-NEWLOWERING-NEXT: b .LBB0_243; CHECK-NEWLOWERING-NEXT: .LBB0_2:44; CHECK-NEWLOWERING-NEXT: smstart za45; CHECK-NEWLOWERING-NEXT: bl shared_za_callee46; CHECK-NEWLOWERING-NEXT: smstop za47; CHECK-NEWLOWERING-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload48; CHECK-NEWLOWERING-NEXT: ret49 call void @shared_za_callee()50 ret void51}52 53; Note: This test must run at -O0 as otherwise the multiple exits are optimized out.54; TODO: We should be able to omit the ZA save here (as this function does not use ZA).55define i32 @private_za_multiple_exit(i32 %a, i32 %b, i64 %cond) "aarch64_new_za" {56; CHECK-LABEL: private_za_multiple_exit:57; CHECK: // %bb.0: // %prelude58; CHECK-NEXT: sub sp, sp, #3259; CHECK-NEXT: str x30, [sp, #16] // 8-byte Spill60; CHECK-NEXT: .cfi_def_cfa_offset 3261; CHECK-NEXT: .cfi_offset w30, -1662; CHECK-NEXT: str x2, [sp] // 8-byte Spill63; CHECK-NEXT: str w1, [sp, #8] // 4-byte Spill64; CHECK-NEXT: str w0, [sp, #12] // 4-byte Spill65; CHECK-NEXT: rdsvl x8, #166; CHECK-NEXT: mrs x8, TPIDR2_EL067; CHECK-NEXT: cbz x8, .LBB1_268; CHECK-NEXT: b .LBB1_169; CHECK-NEXT: .LBB1_1: // %save.za70; CHECK-NEXT: bl __arm_tpidr2_save71; CHECK-NEXT: mov x8, xzr72; CHECK-NEXT: msr TPIDR2_EL0, x873; CHECK-NEXT: b .LBB1_274; CHECK-NEXT: .LBB1_2: // %entry75; CHECK-NEXT: ldr x8, [sp] // 8-byte Reload76; CHECK-NEXT: smstart za77; CHECK-NEXT: zero {za}78; CHECK-NEXT: subs x8, x8, #179; CHECK-NEXT: b.ne .LBB1_480; CHECK-NEXT: b .LBB1_381; CHECK-NEXT: .LBB1_3: // %if.else82; CHECK-NEXT: ldr w8, [sp, #12] // 4-byte Reload83; CHECK-NEXT: ldr w9, [sp, #8] // 4-byte Reload84; CHECK-NEXT: add w0, w8, w985; CHECK-NEXT: smstop za86; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Reload87; CHECK-NEXT: add sp, sp, #3288; CHECK-NEXT: ret89; CHECK-NEXT: .LBB1_4: // %if.end90; CHECK-NEXT: ldr w8, [sp, #12] // 4-byte Reload91; CHECK-NEXT: ldr w9, [sp, #8] // 4-byte Reload92; CHECK-NEXT: subs w0, w8, w993; CHECK-NEXT: smstop za94; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Reload95; CHECK-NEXT: add sp, sp, #3296; CHECK-NEXT: ret97;98; CHECK-NEWLOWERING-LABEL: private_za_multiple_exit:99; CHECK-NEWLOWERING: // %bb.0: // %entry100; CHECK-NEWLOWERING-NEXT: sub sp, sp, #16101; CHECK-NEWLOWERING-NEXT: .cfi_def_cfa_offset 16102; CHECK-NEWLOWERING-NEXT: mrs x8, TPIDR2_EL0103; CHECK-NEWLOWERING-NEXT: cbnz x8, .LBB1_1104; CHECK-NEWLOWERING-NEXT: b .LBB1_2105; CHECK-NEWLOWERING-NEXT: .LBB1_1: // %entry106; CHECK-NEWLOWERING-NEXT: bl __arm_tpidr2_save107; CHECK-NEWLOWERING-NEXT: msr TPIDR2_EL0, xzr108; CHECK-NEWLOWERING-NEXT: zero {za}109; CHECK-NEWLOWERING-NEXT: b .LBB1_2110; CHECK-NEWLOWERING-NEXT: .LBB1_2: // %entry111; CHECK-NEWLOWERING-NEXT: smstart za112; CHECK-NEWLOWERING-NEXT: str w1, [sp, #8] // 4-byte Spill113; CHECK-NEWLOWERING-NEXT: str w0, [sp, #12] // 4-byte Spill114; CHECK-NEWLOWERING-NEXT: subs x8, x2, #1115; CHECK-NEWLOWERING-NEXT: b.ne .LBB1_4116; CHECK-NEWLOWERING-NEXT: b .LBB1_3117; CHECK-NEWLOWERING-NEXT: .LBB1_3: // %if.else118; CHECK-NEWLOWERING-NEXT: ldr w8, [sp, #12] // 4-byte Reload119; CHECK-NEWLOWERING-NEXT: ldr w9, [sp, #8] // 4-byte Reload120; CHECK-NEWLOWERING-NEXT: add w0, w8, w9121; CHECK-NEWLOWERING-NEXT: smstop za122; CHECK-NEWLOWERING-NEXT: add sp, sp, #16123; CHECK-NEWLOWERING-NEXT: ret124; CHECK-NEWLOWERING-NEXT: .LBB1_4: // %if.end125; CHECK-NEWLOWERING-NEXT: ldr w8, [sp, #12] // 4-byte Reload126; CHECK-NEWLOWERING-NEXT: ldr w9, [sp, #8] // 4-byte Reload127; CHECK-NEWLOWERING-NEXT: subs w0, w8, w9128; CHECK-NEWLOWERING-NEXT: smstop za129; CHECK-NEWLOWERING-NEXT: add sp, sp, #16130; CHECK-NEWLOWERING-NEXT: ret131entry:132 %tobool = icmp eq i64 %cond, 1133 br i1 %tobool, label %if.else, label %if.end134 135if.else:136 %add = add i32 %a, %b137 ret i32 %add138 139if.end:140 %sub = sub i32 %a, %b141 ret i32 %sub142}143 144; In simple cases like this we should omit all ZA setup.145define i32 @private_za_trivially_does_not_use_za(i32 %x) "aarch64_new_za" {146; CHECK-LABEL: private_za_trivially_does_not_use_za:147; CHECK: // %bb.0: // %prelude148; CHECK-NEXT: sub sp, sp, #32149; CHECK-NEXT: str x30, [sp, #16] // 8-byte Spill150; CHECK-NEXT: .cfi_def_cfa_offset 32151; CHECK-NEXT: .cfi_offset w30, -16152; CHECK-NEXT: str w0, [sp, #12] // 4-byte Spill153; CHECK-NEXT: rdsvl x8, #1154; CHECK-NEXT: mrs x8, TPIDR2_EL0155; CHECK-NEXT: cbz x8, .LBB2_2156; CHECK-NEXT: b .LBB2_1157; CHECK-NEXT: .LBB2_1: // %save.za158; CHECK-NEXT: bl __arm_tpidr2_save159; CHECK-NEXT: mov x8, xzr160; CHECK-NEXT: msr TPIDR2_EL0, x8161; CHECK-NEXT: b .LBB2_2162; CHECK-NEXT: .LBB2_2:163; CHECK-NEXT: ldr w8, [sp, #12] // 4-byte Reload164; CHECK-NEXT: smstart za165; CHECK-NEXT: zero {za}166; CHECK-NEXT: add w0, w8, w8167; CHECK-NEXT: smstop za168; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Reload169; CHECK-NEXT: add sp, sp, #32170; CHECK-NEXT: ret171;172; CHECK-NEWLOWERING-LABEL: private_za_trivially_does_not_use_za:173; CHECK-NEWLOWERING: // %bb.0:174; CHECK-NEWLOWERING-NEXT: add w0, w0, w0175; CHECK-NEWLOWERING-NEXT: ret176 %ret = add i32 %x, %x177 ret i32 %ret178}179