brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.7 KiB · d97d9d1 Raw
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