[Alignment][NFC] migrate DataLayout internal struct to llvm::Align
[llvm-core.git] / test / CodeGen / AArch64 / aarch64-stp-cluster.ll
blob6d9b7d4bb4fccc98cd64f5325ac7731504fdf8e8
1 ; REQUIRES: asserts
2 ; RUN: llc < %s -mtriple=arm64-linux-gnu -mcpu=cortex-a57 -verify-misched -debug-only=machine-scheduler -aarch64-enable-stp-suppress=false -o - 2>&1 > /dev/null | FileCheck %s
4 ; CHECK: ********** MI Scheduling **********
5 ; CHECK-LABEL: stp_i64_scale:%bb.0
6 ; CHECK:Cluster ld/st SU(4) - SU(3)
7 ; CHECK:Cluster ld/st SU(2) - SU(5)
8 ; CHECK:SU(4):   STRXui %1:gpr64, %0:gpr64common, 1
9 ; CHECK:SU(3):   STRXui %1:gpr64, %0:gpr64common, 2
10 ; CHECK:SU(2):   STRXui %1:gpr64, %0:gpr64common, 3
11 ; CHECK:SU(5):   STRXui %1:gpr64, %0:gpr64common, 4
12 define i64 @stp_i64_scale(i64* nocapture %P, i64 %v) {
13 entry:
14   %arrayidx = getelementptr inbounds i64, i64* %P, i64 3
15   store i64 %v, i64* %arrayidx
16   %arrayidx1 = getelementptr inbounds i64, i64* %P, i64 2
17   store i64 %v, i64* %arrayidx1
18   %arrayidx2 = getelementptr inbounds i64, i64* %P, i64 1
19   store i64 %v, i64* %arrayidx2
20   %arrayidx3 = getelementptr inbounds i64, i64* %P, i64 4
21   store i64 %v, i64* %arrayidx3
22   ret i64 %v
25 ; CHECK: ********** MI Scheduling **********
26 ; CHECK-LABEL: stp_i32_scale:%bb.0
27 ; CHECK:Cluster ld/st SU(4) - SU(3)
28 ; CHECK:Cluster ld/st SU(2) - SU(5)
29 ; CHECK:SU(4):   STRWui %1:gpr32, %0:gpr64common, 1
30 ; CHECK:SU(3):   STRWui %1:gpr32, %0:gpr64common, 2
31 ; CHECK:SU(2):   STRWui %1:gpr32, %0:gpr64common, 3
32 ; CHECK:SU(5):   STRWui %1:gpr32, %0:gpr64common, 4
33 define i32 @stp_i32_scale(i32* nocapture %P, i32 %v) {
34 entry:
35   %arrayidx = getelementptr inbounds i32, i32* %P, i32 3
36   store i32 %v, i32* %arrayidx
37   %arrayidx1 = getelementptr inbounds i32, i32* %P, i32 2
38   store i32 %v, i32* %arrayidx1
39   %arrayidx2 = getelementptr inbounds i32, i32* %P, i32 1
40   store i32 %v, i32* %arrayidx2
41   %arrayidx3 = getelementptr inbounds i32, i32* %P, i32 4
42   store i32 %v, i32* %arrayidx3
43   ret i32 %v
46 ; CHECK:********** MI Scheduling **********
47 ; CHECK-LABEL:stp_i64_unscale:%bb.0 entry
48 ; CHECK:Cluster ld/st SU(5) - SU(2)
49 ; CHECK:Cluster ld/st SU(4) - SU(3)
50 ; CHECK:SU(5):   STURXi %1:gpr64, %0:gpr64common, -32
51 ; CHECK:SU(2):   STURXi %1:gpr64, %0:gpr64common, -24
52 ; CHECK:SU(4):   STURXi %1:gpr64, %0:gpr64common, -16
53 ; CHECK:SU(3):   STURXi %1:gpr64, %0:gpr64common, -8
54 define void @stp_i64_unscale(i64* nocapture %P, i64 %v) #0 {
55 entry:
56   %arrayidx = getelementptr inbounds i64, i64* %P, i64 -3
57   store i64 %v, i64* %arrayidx
58   %arrayidx1 = getelementptr inbounds i64, i64* %P, i64 -1
59   store i64 %v, i64* %arrayidx1
60   %arrayidx2 = getelementptr inbounds i64, i64* %P, i64 -2
61   store i64 %v, i64* %arrayidx2
62   %arrayidx3 = getelementptr inbounds i64, i64* %P, i64 -4
63   store i64 %v, i64* %arrayidx3
64   ret void
67 ; CHECK:********** MI Scheduling **********
68 ; CHECK-LABEL:stp_i32_unscale:%bb.0 entry
69 ; CHECK:Cluster ld/st SU(5) - SU(2)
70 ; CHECK:Cluster ld/st SU(4) - SU(3)
71 ; CHECK:SU(5):   STURWi %1:gpr32, %0:gpr64common, -16
72 ; CHECK:SU(2):   STURWi %1:gpr32, %0:gpr64common, -12
73 ; CHECK:SU(4):   STURWi %1:gpr32, %0:gpr64common, -8
74 ; CHECK:SU(3):   STURWi %1:gpr32, %0:gpr64common, -4
75 define void @stp_i32_unscale(i32* nocapture %P, i32 %v) #0 {
76 entry:
77   %arrayidx = getelementptr inbounds i32, i32* %P, i32 -3
78   store i32 %v, i32* %arrayidx
79   %arrayidx1 = getelementptr inbounds i32, i32* %P, i32 -1
80   store i32 %v, i32* %arrayidx1
81   %arrayidx2 = getelementptr inbounds i32, i32* %P, i32 -2
82   store i32 %v, i32* %arrayidx2
83   %arrayidx3 = getelementptr inbounds i32, i32* %P, i32 -4
84   store i32 %v, i32* %arrayidx3
85   ret void
88 ; CHECK:********** MI Scheduling **********
89 ; CHECK-LABEL:stp_double:%bb.0
90 ; CHECK:Cluster ld/st SU(3) - SU(4)
91 ; CHECK:Cluster ld/st SU(2) - SU(5)
92 ; CHECK:SU(3):   STRDui %1:fpr64, %0:gpr64common, 1
93 ; CHECK:SU(4):   STRDui %1:fpr64, %0:gpr64common, 2
94 ; CHECK:SU(2):   STRDui %1:fpr64, %0:gpr64common, 3
95 ; CHECK:SU(5):   STRDui %1:fpr64, %0:gpr64common, 4
96 define void @stp_double(double* nocapture %P, double %v)  {
97 entry:
98   %arrayidx = getelementptr inbounds double, double* %P, i64 3
99   store double %v, double* %arrayidx
100   %arrayidx1 = getelementptr inbounds double, double* %P, i64 1
101   store double %v, double* %arrayidx1
102   %arrayidx2 = getelementptr inbounds double, double* %P, i64 2
103   store double %v, double* %arrayidx2
104   %arrayidx3 = getelementptr inbounds double, double* %P, i64 4
105   store double %v, double* %arrayidx3
106   ret void
109 ; CHECK:********** MI Scheduling **********
110 ; CHECK-LABEL:stp_float:%bb.0
111 ; CHECK:Cluster ld/st SU(3) - SU(4)
112 ; CHECK:Cluster ld/st SU(2) - SU(5)
113 ; CHECK:SU(3):   STRSui %1:fpr32, %0:gpr64common, 1
114 ; CHECK:SU(4):   STRSui %1:fpr32, %0:gpr64common, 2
115 ; CHECK:SU(2):   STRSui %1:fpr32, %0:gpr64common, 3
116 ; CHECK:SU(5):   STRSui %1:fpr32, %0:gpr64common, 4
117 define void @stp_float(float* nocapture %P, float %v)  {
118 entry:
119   %arrayidx = getelementptr inbounds float, float* %P, i64 3
120   store float %v, float* %arrayidx
121   %arrayidx1 = getelementptr inbounds float, float* %P, i64 1
122   store float %v, float* %arrayidx1
123   %arrayidx2 = getelementptr inbounds float, float* %P, i64 2
124   store float %v, float* %arrayidx2
125   %arrayidx3 = getelementptr inbounds float, float* %P, i64 4
126   store float %v, float* %arrayidx3
127   ret void
130 ; CHECK: ********** MI Scheduling **********
131 ; CHECK-LABEL: stp_volatile:%bb.0
132 ; CHECK-NOT: Cluster ld/st
133 ; CHECK:SU(2):   STRXui %1:gpr64, %0:gpr64common, 3 :: (volatile
134 ; CHECK:SU(3):   STRXui %1:gpr64, %0:gpr64common, 2 :: (volatile
135 ; CHECK:SU(4):   STRXui %1:gpr64, %0:gpr64common, 1 :: (volatile
136 ; CHECK:SU(5):   STRXui %1:gpr64, %0:gpr64common, 4 :: (volatile
137 define i64 @stp_volatile(i64* nocapture %P, i64 %v) {
138 entry:
139   %arrayidx = getelementptr inbounds i64, i64* %P, i64 3
140   store volatile i64 %v, i64* %arrayidx
141   %arrayidx1 = getelementptr inbounds i64, i64* %P, i64 2
142   store volatile i64 %v, i64* %arrayidx1
143   %arrayidx2 = getelementptr inbounds i64, i64* %P, i64 1
144   store volatile i64 %v, i64* %arrayidx2
145   %arrayidx3 = getelementptr inbounds i64, i64* %P, i64 4
146   store volatile i64 %v, i64* %arrayidx3
147   ret i64 %v