124 lines
5.3 KiB
LLVM
124 lines
5.3 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme -start-after=simplifycfg -enable-tail-merge=false -verify-machineinstrs < %s | FileCheck %s
|
|
|
|
declare void @normal_callee();
|
|
declare void @streaming_callee() "aarch64_pstate_sm_enabled";
|
|
declare void @streaming_compatible_callee() "aarch64_pstate_sm_compatible";
|
|
|
|
define float @sm_body_sm_compatible_simple() "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" nounwind {
|
|
; CHECK-LABEL: sm_body_sm_compatible_simple:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill
|
|
; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
|
|
; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
|
|
; CHECK-NEXT: str x30, [sp, #64] // 8-byte Folded Spill
|
|
; CHECK-NEXT: bl __arm_sme_state
|
|
; CHECK-NEXT: and x8, x0, #0x1
|
|
; CHECK-NEXT: tbnz w8, #0, .LBB0_2
|
|
; CHECK-NEXT: // %bb.1:
|
|
; CHECK-NEXT: smstart sm
|
|
; CHECK-NEXT: .LBB0_2:
|
|
; CHECK-NEXT: tbnz w8, #0, .LBB0_4
|
|
; CHECK-NEXT: // %bb.3:
|
|
; CHECK-NEXT: smstop sm
|
|
; CHECK-NEXT: .LBB0_4:
|
|
; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload
|
|
; CHECK-NEXT: fmov s0, wzr
|
|
; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload
|
|
; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload
|
|
; CHECK-NEXT: ldp d15, d14, [sp], #80 // 16-byte Folded Reload
|
|
; CHECK-NEXT: ret
|
|
ret float zeroinitializer
|
|
}
|
|
|
|
define void @sm_body_caller_sm_compatible_caller_normal_callee() "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" nounwind {
|
|
; CHECK-LABEL: sm_body_caller_sm_compatible_caller_normal_callee:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill
|
|
; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
|
|
; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
|
|
; CHECK-NEXT: stp x30, x19, [sp, #64] // 16-byte Folded Spill
|
|
; CHECK-NEXT: bl __arm_sme_state
|
|
; CHECK-NEXT: and x19, x0, #0x1
|
|
; CHECK-NEXT: tbnz w19, #0, .LBB1_2
|
|
; CHECK-NEXT: // %bb.1:
|
|
; CHECK-NEXT: smstart sm
|
|
; CHECK-NEXT: .LBB1_2:
|
|
; CHECK-NEXT: smstop sm
|
|
; CHECK-NEXT: bl normal_callee
|
|
; CHECK-NEXT: smstart sm
|
|
; CHECK-NEXT: tbnz w19, #0, .LBB1_4
|
|
; CHECK-NEXT: // %bb.3:
|
|
; CHECK-NEXT: smstop sm
|
|
; CHECK-NEXT: .LBB1_4:
|
|
; CHECK-NEXT: ldp x30, x19, [sp, #64] // 16-byte Folded Reload
|
|
; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload
|
|
; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload
|
|
; CHECK-NEXT: ldp d15, d14, [sp], #80 // 16-byte Folded Reload
|
|
; CHECK-NEXT: ret
|
|
call void @normal_callee()
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nounwind uwtable vscale_range(1,16)
|
|
define void @streaming_body_and_streaming_compatible_interface_multi_basic_block(i32 noundef %x) "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" nounwind {
|
|
; CHECK-LABEL: streaming_body_and_streaming_compatible_interface_multi_basic_block:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill
|
|
; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
|
|
; CHECK-NEXT: mov w8, w0
|
|
; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
|
|
; CHECK-NEXT: stp x30, x19, [sp, #64] // 16-byte Folded Spill
|
|
; CHECK-NEXT: bl __arm_sme_state
|
|
; CHECK-NEXT: and x19, x0, #0x1
|
|
; CHECK-NEXT: tbnz w19, #0, .LBB2_2
|
|
; CHECK-NEXT: // %bb.1: // %entry
|
|
; CHECK-NEXT: smstart sm
|
|
; CHECK-NEXT: .LBB2_2: // %entry
|
|
; CHECK-NEXT: cbz w8, .LBB2_6
|
|
; CHECK-NEXT: // %bb.3: // %if.else
|
|
; CHECK-NEXT: bl streaming_compatible_callee
|
|
; CHECK-NEXT: tbnz w19, #0, .LBB2_5
|
|
; CHECK-NEXT: // %bb.4: // %if.else
|
|
; CHECK-NEXT: smstop sm
|
|
; CHECK-NEXT: .LBB2_5: // %if.else
|
|
; CHECK-NEXT: ldp x30, x19, [sp, #64] // 16-byte Folded Reload
|
|
; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload
|
|
; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload
|
|
; CHECK-NEXT: ldp d15, d14, [sp], #80 // 16-byte Folded Reload
|
|
; CHECK-NEXT: ret
|
|
; CHECK-NEXT: .LBB2_6: // %if.then
|
|
; CHECK-NEXT: smstop sm
|
|
; CHECK-NEXT: bl normal_callee
|
|
; CHECK-NEXT: smstart sm
|
|
; CHECK-NEXT: tbnz w19, #0, .LBB2_8
|
|
; CHECK-NEXT: // %bb.7: // %if.then
|
|
; CHECK-NEXT: smstop sm
|
|
; CHECK-NEXT: .LBB2_8: // %if.then
|
|
; CHECK-NEXT: ldp x30, x19, [sp, #64] // 16-byte Folded Reload
|
|
; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload
|
|
; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload
|
|
; CHECK-NEXT: ldp d15, d14, [sp], #80 // 16-byte Folded Reload
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%cmp = icmp eq i32 %x, 0
|
|
br i1 %cmp, label %if.then, label %if.else
|
|
|
|
if.then: ; preds = %entry
|
|
tail call void @normal_callee()
|
|
br label %return
|
|
|
|
if.else: ; preds = %entry
|
|
tail call void @streaming_compatible_callee()
|
|
br label %return
|
|
|
|
return: ; preds = %if.else, %if.then
|
|
ret void
|
|
}
|