Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / AArch64 / ssve-stack-hazard-remarks.ll
blob0b6bf3892a0c2b78bd316f87872a02200da9fc18
1 ; RUN: llc < %s -mtriple=aarch64 -mattr=+sve2 -pass-remarks-analysis=sme -aarch64-stack-hazard-remark-size=64 -o /dev/null < %s 2>&1 | FileCheck %s --check-prefixes=CHECK
2 ; RUN: llc < %s -mtriple=aarch64 -mattr=+sve2 -pass-remarks-analysis=sme -aarch64-stack-hazard-size=1024 -o /dev/null < %s 2>&1 | FileCheck %s --check-prefixes=CHECK-PADDING
4 ; Don't emit remarks for non-streaming functions.
5 define float @csr_x20_stackargs_notsc(float %a, float %b, float %c, float %d, float %e, float %f, float %g, float %h, float %i) {
6 ; CHECK-NOT: remark: <unknown>:0:0: stack hazard in 'csr_x20_stackargs_notsc':
7 ; CHECK-PADDING-NOT: remark: <unknown>:0:0: stack hazard in 'csr_x20_stackargs_notsc':
8 entry:
9   tail call void asm sideeffect "", "~{x20}"() #1
10   ret float %i
13 ; Don't emit remarks for functions that only access GPR stack objects.
14 define i64 @stackargs_gpr(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f, i64 %g, i64 %h, i64 %i) #2 {
15 ; CHECK-NOT: remark: <unknown>:0:0: stack hazard in 'csr_x20_stackargs_gpr':
16 ; CHECK-PADDING-NOT: remark: <unknown>:0:0: stack hazard in 'csr_x20_stackargs_gpr':
17 entry:
18   ret i64 %i
21 ; Don't emit remarks for functions that only access FPR stack objects.
22 define double @stackargs_fpr(double %a, double %b, double %c, double %d, double %e, double %f, double %g, double %h, double %i) #2 {
23 ; CHECK-NOT: remark: <unknown>:0:0: stack hazard in 'csr_x20_stackargs_fpr':
24 ; CHECK-PADDING-NOT: remark: <unknown>:0:0: stack hazard in 'csr_x20_stackargs_fpr':
25 entry:
26   ret double %i
29 ; As this case is handled by addition of stack hazard padding, only emit remarks when this is not switched on.
30 define i32 @csr_d8_alloci64(i64 %d) #2 {
31 ; CHECK: remark: <unknown>:0:0: stack hazard in 'csr_d8_alloci64': FPR stack object at [SP-16] is too close to GPR stack object at [SP-8]
32 ; CHECK-PADDING-NOT: remark: <unknown>:0:0: stack hazard in 'csr_d8_alloci64':
33 entry:
34   %a = alloca i64
35   tail call void asm sideeffect "", "~{d8}"() #1
36   store i64 %d, ptr %a
37   ret i32 0
40 ; As this case is handled by addition of stack hazard padding, only emit remarks when this is not switched on.
41 define i32 @csr_d8_allocnxv4i32(i64 %d) #2 {
42 ; CHECK: remark: <unknown>:0:0: stack hazard in 'csr_d8_allocnxv4i32': FPR stack object at [SP-16] is too close to GPR stack object at [SP-8]
43 ; CHECK-PADDING-NOT: remark: <unknown>:0:0: stack hazard in 'csr_d8_allocnxv4i32':
44 entry:
45   %a = alloca <vscale x 4 x i32>
46   tail call void asm sideeffect "", "~{d8}"() #1
47   store <vscale x 4 x i32> zeroinitializer, ptr %a
48   ret i32 0
51 define float @csr_x20_stackargs(float %a, float %b, float %c, float %d, float %e, float %f, float %g, float %h, float %i) #2 {
52 ; CHECK: remark: <unknown>:0:0: stack hazard in 'csr_x20_stackargs': GPR stack object at [SP-16] is too close to FPR stack object at [SP+0]
53 ; CHECK-PADDING: remark: <unknown>:0:0: stack hazard in 'csr_x20_stackargs': GPR stack object at [SP-16] is too close to FPR stack object at [SP+0]
54 entry:
55   tail call void asm sideeffect "", "~{x20}"() #1
56   ret float %i
59 ; In this case, addition of stack hazard padding triggers x29 (fp) spill, so we hazard occurs between FPR argument and GPR spill.
60 define float @csr_d8_stackargs(float %a, float %b, float %c, float %d, float %e, float %f, float %g, float %h, float %i) #2 {
61 ; CHECK-NOT: remark: <unknown>:0:0: stack hazard in 'csr_d8_stackargs':
62 ; CHECK-PADDING: remark: <unknown>:0:0: stack hazard in 'csr_d8_stackargs': GPR stack object at [SP-8] is too close to FPR stack object at [SP+0]
63 entry:
64   tail call void asm sideeffect "", "~{d8}"() #1
65   ret float %i
68 ; SVE calling conventions
69 ; Predicate register spills end up in FP region, currently.
71 define i32 @svecc_call(<4 x i16> %P0, ptr %P1, i32 %P2, <vscale x 16 x i8> %P3, i16 %P4) #2 {
72 ; CHECK: remark: <unknown>:0:0: stack hazard in 'svecc_call': PPR stack object at [SP-48-258 * vscale] is too close to FPR stack object at [SP-48-256 * vscale]
73 ; CHECK: remark: <unknown>:0:0: stack hazard in 'svecc_call': FPR stack object at [SP-48-16 * vscale] is too close to GPR stack object at [SP-48]
74 ; CHECK-PADDING: remark: <unknown>:0:0: stack hazard in 'svecc_call': PPR stack object at [SP-1072-258 * vscale] is too close to FPR stack object at [SP-1072-256 * vscale]
75 ; CHECK-PADDING-NOT: remark: <unknown>:0:0: stack hazard in 'svecc_call':
76 entry:
77   tail call void asm sideeffect "", "~{x0},~{x28},~{x27},~{x3}"() #2
78   %call = call ptr @memset(ptr noundef nonnull %P1, i32 noundef 45, i32 noundef 37)
79   ret i32 -396142473
82 define i32 @svecc_alloca_call(<4 x i16> %P0, ptr %P1, i32 %P2, <vscale x 16 x i8> %P3, i16 %P4) #2 {
83 ; CHECK: remark: <unknown>:0:0: stack hazard in 'svecc_alloca_call': PPR stack object at [SP-48-258 * vscale] is too close to FPR stack object at [SP-48-256 * vscale]
84 ; CHECK: remark: <unknown>:0:0: stack hazard in 'svecc_alloca_call': FPR stack object at [SP-48-16 * vscale] is too close to GPR stack object at [SP-48]
85 ; CHECK-PADDING: remark: <unknown>:0:0: stack hazard in 'svecc_alloca_call': PPR stack object at [SP-1072-258 * vscale] is too close to FPR stack object at [SP-1072-256 * vscale]
86 ; CHECK-PADDING-NOT: remark: <unknown>:0:0: stack hazard in 'svecc_alloca_call':
87 entry:
88   tail call void asm sideeffect "", "~{x0},~{x28},~{x27},~{x3}"() #2
89   %0 = alloca [37 x i8], align 16
90   %call = call ptr @memset(ptr noundef nonnull %0, i32 noundef 45, i32 noundef 37)
91   ret i32 -396142473
93 declare ptr @memset(ptr, i32, i32)
95 %struct.mixed_struct = type { i32, float }
97 define i32 @mixed_stack_object(i32  %a, float %b) #2 {
98 ; CHECK: remark: <unknown>:0:0: stack hazard in 'mixed_stack_object': Mixed stack object at [SP-8] accessed by both GP and FP instructions
99 ; CHECK-PADDING: remark: <unknown>:0:0: stack hazard in 'mixed_stack_object': Mixed stack object at [SP-8] accessed by both GP and FP instructions
100 entry:
101   %s = alloca %struct.mixed_struct
102   %s.i = getelementptr %struct.mixed_struct, ptr %s, i32 0, i32 0
103   %s.f = getelementptr %struct.mixed_struct, ptr %s, i32 0, i32 1
104   store i32 %a, ptr %s.i
105   store float %b, ptr %s.f
106   ret i32 %a
109 define i32 @mixed_stack_objects(i32  %a, float %b) #2 {
110 ; CHECK: remark: <unknown>:0:0: stack hazard in 'mixed_stack_objects': Mixed stack object at [SP-16] is too close to Mixed stack object at [SP-8]
111 ; CHECK: remark: <unknown>:0:0: stack hazard in 'mixed_stack_objects': Mixed stack object at [SP-16] accessed by both GP and FP instructions
112 ; CHECK: remark: <unknown>:0:0: stack hazard in 'mixed_stack_objects': Mixed stack object at [SP-8] accessed by both GP and FP instructions
113 ; CHECK-PADDING: remark: <unknown>:0:0: stack hazard in 'mixed_stack_objects': Mixed stack object at [SP-16] is too close to Mixed stack object at [SP-8]
114 ; CHECK-PADDING: remark: <unknown>:0:0: stack hazard in 'mixed_stack_objects': Mixed stack object at [SP-16] accessed by both GP and FP instructions
115 ; CHECK-PADDING: remark: <unknown>:0:0: stack hazard in 'mixed_stack_objects': Mixed stack object at [SP-8] accessed by both GP and FP instructions
116 entry:
117   %s0 = alloca %struct.mixed_struct
118   %s0.i = getelementptr %struct.mixed_struct, ptr %s0, i32 0, i32 0
119   %s0.f = getelementptr %struct.mixed_struct, ptr %s0, i32 0, i32 1
120   store i32 %a, ptr %s0.i
121   store float %b, ptr %s0.f
123   %s1 = alloca %struct.mixed_struct
124   %s1.i = getelementptr %struct.mixed_struct, ptr %s1, i32 0, i32 0
125   %s1.f = getelementptr %struct.mixed_struct, ptr %s1, i32 0, i32 1
126   store i32 %a, ptr %s1.i
127   store float %b, ptr %s1.f
129   ret i32 %a
132 ; VLA-area stack objects are not separated.
133 define i32 @csr_d8_allocnxv4i32i32f64_vlai32f64(double %d, i32 %i) #2 {
134 ; CHECK: remark: <unknown>:0:0: stack hazard in 'csr_d8_allocnxv4i32i32f64_vlai32f64': GPR stack object at [SP-48-16 * vscale] is too close to FPR stack object at [SP-48-16 * vscale]
135 ; CHECK: remark: <unknown>:0:0: stack hazard in 'csr_d8_allocnxv4i32i32f64_vlai32f64': FPR stack object at [SP-32] is too close to GPR stack object at [SP-24]
136 ; CHECK-PADDING: remark: <unknown>:0:0: stack hazard in 'csr_d8_allocnxv4i32i32f64_vlai32f64': GPR stack object at [SP-2096-16 * vscale] is too close to FPR stack object at [SP-2096-16 * vscale]
137 ; CHECK-PADDING-NOT: remark: <unknown>:0:0: stack hazard in 'csr_d8_allocnxv4i32i32f64_vlai32f64':
138 entry:
139   %a = alloca <vscale x 4 x i32>
140   %0 = zext i32 %i to i64
141   %vla0 = alloca i32, i64 %0
142   %vla1 = alloca double, i64 %0
143   %c = alloca double
144   tail call void asm sideeffect "", "~{d8}"() #1
145   store <vscale x 4 x i32> zeroinitializer, ptr %a
146   store i32 zeroinitializer, ptr %vla0
147   store double %d, ptr %vla1
148   store double %d, ptr %c
149   ret i32 0
152 attributes #2 = { "aarch64_pstate_sm_compatible" }