245 lines · plain
1; REQUIRES: asserts2; 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 %s3; RUN: llc < %s -mtriple=arm64-linux-gnu -mcpu=cortex-a57 -force-fast-cluster -verify-misched -debug-only=machine-scheduler -aarch64-enable-stp-suppress=false -o - 2>&1 > /dev/null | FileCheck %s --check-prefix=CHECK-FAST4 5; CHECK: ********** MI Scheduling **********6; CHECK-LABEL: stp_i64_scale:%bb.07; CHECK:Cluster ld/st SU(3) - SU(4)8; CHECK:Cluster ld/st SU(2) - SU(5)9; CHECK:SU(4): STRXui %1:gpr64, %0:gpr64common, 110; CHECK:SU(3): STRXui %1:gpr64, %0:gpr64common, 211; CHECK:SU(2): STRXui %1:gpr64, %0:gpr64common, 312; CHECK:SU(5): STRXui %1:gpr64, %0:gpr64common, 413define i64 @stp_i64_scale(ptr nocapture %P, i64 %v) {14entry:15 %arrayidx = getelementptr inbounds i64, ptr %P, i64 316 store i64 %v, ptr %arrayidx17 %arrayidx1 = getelementptr inbounds i64, ptr %P, i64 218 store i64 %v, ptr %arrayidx119 %arrayidx2 = getelementptr inbounds i64, ptr %P, i64 120 store i64 %v, ptr %arrayidx221 %arrayidx3 = getelementptr inbounds i64, ptr %P, i64 422 store i64 %v, ptr %arrayidx323 ret i64 %v24}25 26; CHECK: ********** MI Scheduling **********27; CHECK-LABEL: stp_i32_scale:%bb.028; CHECK:Cluster ld/st SU(3) - SU(4)29; CHECK:Cluster ld/st SU(2) - SU(5)30; CHECK:SU(4): STRWui %1:gpr32, %0:gpr64common, 131; CHECK:SU(3): STRWui %1:gpr32, %0:gpr64common, 232; CHECK:SU(2): STRWui %1:gpr32, %0:gpr64common, 333; CHECK:SU(5): STRWui %1:gpr32, %0:gpr64common, 434define i32 @stp_i32_scale(ptr nocapture %P, i32 %v) {35entry:36 %arrayidx = getelementptr inbounds i32, ptr %P, i32 337 store i32 %v, ptr %arrayidx38 %arrayidx1 = getelementptr inbounds i32, ptr %P, i32 239 store i32 %v, ptr %arrayidx140 %arrayidx2 = getelementptr inbounds i32, ptr %P, i32 141 store i32 %v, ptr %arrayidx242 %arrayidx3 = getelementptr inbounds i32, ptr %P, i32 443 store i32 %v, ptr %arrayidx344 ret i32 %v45}46 47; CHECK:********** MI Scheduling **********48; CHECK-LABEL:stp_i64_unscale:%bb.0 entry49; CHECK:Cluster ld/st SU(2) - SU(5)50; CHECK:Cluster ld/st SU(3) - SU(4)51; CHECK:SU(2): STURXi %1:gpr64, %0:gpr64common, -2452; CHECK:SU(3): STURXi %1:gpr64, %0:gpr64common, -853; CHECK:SU(4): STURXi %1:gpr64, %0:gpr64common, -1654; CHECK:SU(5): STURXi %1:gpr64, %0:gpr64common, -3255define void @stp_i64_unscale(ptr nocapture %P, i64 %v) #0 {56entry:57 %arrayidx = getelementptr inbounds i64, ptr %P, i64 -358 store i64 %v, ptr %arrayidx59 %arrayidx1 = getelementptr inbounds i64, ptr %P, i64 -160 store i64 %v, ptr %arrayidx161 %arrayidx2 = getelementptr inbounds i64, ptr %P, i64 -262 store i64 %v, ptr %arrayidx263 %arrayidx3 = getelementptr inbounds i64, ptr %P, i64 -464 store i64 %v, ptr %arrayidx365 ret void66}67 68; CHECK:********** MI Scheduling **********69; CHECK-LABEL:stp_i32_unscale:%bb.0 entry70; CHECK:Cluster ld/st SU(2) - SU(5)71; CHECK:Cluster ld/st SU(3) - SU(4)72; CHECK:SU(2): STURWi %1:gpr32, %0:gpr64common, -1273; CHECK:SU(3): STURWi %1:gpr32, %0:gpr64common, -474; CHECK:SU(4): STURWi %1:gpr32, %0:gpr64common, -875; CHECK:SU(5): STURWi %1:gpr32, %0:gpr64common, -1676define void @stp_i32_unscale(ptr nocapture %P, i32 %v) #0 {77entry:78 %arrayidx = getelementptr inbounds i32, ptr %P, i32 -379 store i32 %v, ptr %arrayidx80 %arrayidx1 = getelementptr inbounds i32, ptr %P, i32 -181 store i32 %v, ptr %arrayidx182 %arrayidx2 = getelementptr inbounds i32, ptr %P, i32 -283 store i32 %v, ptr %arrayidx284 %arrayidx3 = getelementptr inbounds i32, ptr %P, i32 -485 store i32 %v, ptr %arrayidx386 ret void87}88 89; CHECK:********** MI Scheduling **********90; CHECK-LABEL:stp_double:%bb.091; CHECK:Cluster ld/st SU(3) - SU(4)92; CHECK:Cluster ld/st SU(2) - SU(5)93; CHECK:SU(3): STRDui %1:fpr64, %0:gpr64common, 194; CHECK:SU(4): STRDui %1:fpr64, %0:gpr64common, 295; CHECK:SU(2): STRDui %1:fpr64, %0:gpr64common, 396; CHECK:SU(5): STRDui %1:fpr64, %0:gpr64common, 497define void @stp_double(ptr nocapture %P, double %v) {98entry:99 %arrayidx = getelementptr inbounds double, ptr %P, i64 3100 store double %v, ptr %arrayidx101 %arrayidx1 = getelementptr inbounds double, ptr %P, i64 1102 store double %v, ptr %arrayidx1103 %arrayidx2 = getelementptr inbounds double, ptr %P, i64 2104 store double %v, ptr %arrayidx2105 %arrayidx3 = getelementptr inbounds double, ptr %P, i64 4106 store double %v, ptr %arrayidx3107 ret void108}109 110; CHECK:********** MI Scheduling **********111; CHECK-LABEL:stp_float:%bb.0112; CHECK:Cluster ld/st SU(3) - SU(4)113; CHECK:Cluster ld/st SU(2) - SU(5)114; CHECK:SU(3): STRSui %1:fpr32, %0:gpr64common, 1115; CHECK:SU(4): STRSui %1:fpr32, %0:gpr64common, 2116; CHECK:SU(2): STRSui %1:fpr32, %0:gpr64common, 3117; CHECK:SU(5): STRSui %1:fpr32, %0:gpr64common, 4118define void @stp_float(ptr nocapture %P, float %v) {119entry:120 %arrayidx = getelementptr inbounds float, ptr %P, i64 3121 store float %v, ptr %arrayidx122 %arrayidx1 = getelementptr inbounds float, ptr %P, i64 1123 store float %v, ptr %arrayidx1124 %arrayidx2 = getelementptr inbounds float, ptr %P, i64 2125 store float %v, ptr %arrayidx2126 %arrayidx3 = getelementptr inbounds float, ptr %P, i64 4127 store float %v, ptr %arrayidx3128 ret void129}130 131; CHECK: ********** MI Scheduling **********132; CHECK-LABEL: stp_volatile:%bb.0133; CHECK-NOT: Cluster ld/st134; CHECK:SU(2): STRXui %1:gpr64, %0:gpr64common, 3 :: (volatile135; CHECK:SU(3): STRXui %1:gpr64, %0:gpr64common, 2 :: (volatile136; CHECK:SU(4): STRXui %1:gpr64, %0:gpr64common, 1 :: (volatile137; CHECK:SU(5): STRXui %1:gpr64, %0:gpr64common, 4 :: (volatile138define i64 @stp_volatile(ptr nocapture %P, i64 %v) {139entry:140 %arrayidx = getelementptr inbounds i64, ptr %P, i64 3141 store volatile i64 %v, ptr %arrayidx142 %arrayidx1 = getelementptr inbounds i64, ptr %P, i64 2143 store volatile i64 %v, ptr %arrayidx1144 %arrayidx2 = getelementptr inbounds i64, ptr %P, i64 1145 store volatile i64 %v, ptr %arrayidx2146 %arrayidx3 = getelementptr inbounds i64, ptr %P, i64 4147 store volatile i64 %v, ptr %arrayidx3148 ret i64 %v149}150 151; CHECK: ********** MI Scheduling **********152; CHECK-LABEL: stp_i64_with_ld:%bb.0153; CHECK:Cluster ld/st SU(5) - SU(10)154; CHECK:Cluster ld/st SU(15) - SU(20)155; CHECK:SU(5): STRXui %7:gpr64, %0:gpr64common, 0 ::156; CHECK:SU(10): STRXui %12:gpr64, %0:gpr64common, 1 ::157; CHECK:SU(15): STRXui %17:gpr64, %0:gpr64common, 2 ::158; CHECK:SU(20): STRXui %22:gpr64, %0:gpr64common, 3 ::159define void @stp_i64_with_ld(ptr noalias nocapture %a, ptr noalias nocapture readnone %b, ptr noalias nocapture readnone %c) {160entry:161 %arrayidx = getelementptr inbounds i64, ptr %a, i64 8162 %0 = load i64, ptr %arrayidx, align 8163 %arrayidx3 = getelementptr inbounds i64, ptr %a, i64 16164 %1 = load i64, ptr %arrayidx3, align 8165 %mul = mul nsw i64 %1, %0166 %2 = load i64, ptr %a, align 8167 %add6 = add nsw i64 %2, %mul168 store i64 %add6, ptr %a, align 8169 %arrayidx.1 = getelementptr inbounds i64, ptr %a, i64 9170 %3 = load i64, ptr %arrayidx.1, align 8171 %arrayidx3.1 = getelementptr inbounds i64, ptr %a, i64 17172 %4 = load i64, ptr %arrayidx3.1, align 8173 %mul.1 = mul nsw i64 %4, %3174 %arrayidx5.1 = getelementptr inbounds i64, ptr %a, i64 1175 %5 = load i64, ptr %arrayidx5.1, align 8176 %add6.1 = add nsw i64 %5, %mul.1177 store i64 %add6.1, ptr %arrayidx5.1, align 8178 %arrayidx.2 = getelementptr inbounds i64, ptr %a, i64 10179 %6 = load i64, ptr %arrayidx.2, align 8180 %arrayidx3.2 = getelementptr inbounds i64, ptr %a, i64 18181 %7 = load i64, ptr %arrayidx3.2, align 8182 %mul.2 = mul nsw i64 %7, %6183 %arrayidx5.2 = getelementptr inbounds i64, ptr %a, i64 2184 %8 = load i64, ptr %arrayidx5.2, align 8185 %add6.2 = add nsw i64 %8, %mul.2186 store i64 %add6.2, ptr %arrayidx5.2, align 8187 %arrayidx.3 = getelementptr inbounds i64, ptr %a, i64 11188 %9 = load i64, ptr %arrayidx.3, align 8189 %arrayidx3.3 = getelementptr inbounds i64, ptr %a, i64 19190 %10 = load i64, ptr %arrayidx3.3, align 8191 %mul.3 = mul nsw i64 %10, %9192 %arrayidx5.3 = getelementptr inbounds i64, ptr %a, i64 3193 %11 = load i64, ptr %arrayidx5.3, align 8194 %add6.3 = add nsw i64 %11, %mul.3195 store i64 %add6.3, ptr %arrayidx5.3, align 8196 ret void197}198 199; Verify that the SU(2) and SU(4) are the preds of SU(3)200; CHECK: ********** MI Scheduling **********201; CHECK-LABEL: stp_missing_preds_edges:%bb.0202; CHECK:Cluster ld/st SU(3) - SU(5)203; CHECK: Copy Pred SU(4)204; CHECK: Copy Pred SU(2)205; CHECK:SU(2): %0:gpr64common = COPY $x0206; CHECK:SU(3): STRWui %1:gpr32, %0:gpr64common, 0207; CHECK:SU(4): %3:gpr32common = nsw ADDWri %2:gpr32common, 5, 0208; CHECK:SU(5): STRWui %3:gpr32common, %0:gpr64common, 1209define void @stp_missing_preds_edges(ptr %p, i32 %m, i32 %n) {210entry:211 store i32 %m, ptr %p, align 4212 %add = add nsw i32 %n, 5213 %arrayidx1 = getelementptr inbounds i32, ptr %p, i64 1214 store i32 %add, ptr %arrayidx1, align 4215 ret void216}217 218; Verify that the SU(4) and SU(7) can be clustered even with219; different preds220; CHECK: ********** MI Scheduling **********221; CHECK-LABEL: cluster_with_different_preds:%bb.0222; CHECK:Cluster ld/st SU(4) - SU(7)223; CHECK:SU(3): STRWui %2:gpr32, %0:gpr64common, 0 ::224; CHECK:SU(4): %3:gpr32 = LDRWui %1:gpr64common, 0 ::225; CHECK:Predecessors:226; CHECK: SU(3): Ord Latency=1 Memory227; CHECK:SU(6): STRBBui %4:gpr32, %1:gpr64common, 4 ::228; CHECK:SU(7): %5:gpr32 = LDRWui %1:gpr64common, 1 ::229; CHECK:Predecessors:230; CHECK:SU(6): Ord Latency=1 Memory231; CHECK-FAST: cluster_with_different_preds:%bb.0232; CHECK-FAST-NOT: Cluster ld/st233; CHECK-FAST:SU(3): STRWui %2:gpr32, %0:gpr64common, 0 ::234; CHECK-FAST:SU(4): %3:gpr32 = LDRWui %1:gpr64common, 0 ::235define i32 @cluster_with_different_preds(ptr %p, ptr %q) {236entry:237 store i32 3, ptr %p, align 4238 %0 = load i32, ptr %q, align 4239 %add.ptr = getelementptr inbounds i32, ptr %q, i64 1240 store i8 5, ptr %add.ptr, align 1241 %1 = load i32, ptr %add.ptr, align 4242 %add = add nsw i32 %1, %0243 ret i32 %add244}245