brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.7 KiB · 0717387 Raw
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