182 lines · plain
1# RUN: llc -run-pass=machine-combiner -mtriple=arm64-unknown-unknown %s -o - | FileCheck %s2# RUN: llc -run-pass=machine-combiner -mtriple=arm64-unknown-unknown -acc-max-width=2 %s -o - | FileCheck %s --check-prefix=NARROW-TREE3# RUN: llc -run-pass=machine-combiner -mtriple=arm64-unknown-unknown -acc-min-depth=100 %s -o - | FileCheck %s --check-prefix=NO-TREE4 5# A chain of UABAL instructions that can be reassociated for better ILP.6# Before the optimization, we accumulate in a single long chain.7# CHECK-LABEL: name: uabal_accumulation8# CHECK: [[START1:%.*]]:fpr128 = UABDLv4i16_v4i329# CHECK: [[START2:%.*]]:fpr128 = UABDLv4i16_v4i3210# CHECK: [[START3:%.*]]:fpr128 = UABDLv4i16_v4i3211# CHECK: [[A1:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[START1]] 12# CHECK: [[B1:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[START2]] 13# CHECK: [[C1:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[START3]] 14# CHECK: [[A2:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[A1]] 15# CHECK: [[B2:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[B1]] 16# CHECK: [[C2:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[C1]] 17# CHECK: [[PARTIAL_SUM:%.*]]:fpr128 = ADDv4i32 killed [[A2]], killed [[B2]]18# CHECK: [[TOTAL_SUM:%.*]]:fpr128 = ADDv4i32 killed [[PARTIAL_SUM]], killed [[C2]]19# CHECK: [[END:%.*]]:fpr32 = ADDVv4i32v killed [[TOTAL_SUM]]20 21# NARROW-TREE: [[START1:%.*]]:fpr128 = UABDLv4i16_v4i3222# NARROW-TREE: [[START2:%.*]]:fpr128 = UABDLv4i16_v4i32 23# NARROW-TREE: [[A1:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[START1]]24# NARROW-TREE: [[B1:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[START2]]25# NARROW-TREE: [[A2:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[A1]] 26# NARROW-TREE: [[B2:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[B1]]27# NARROW-TREE: [[A3:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[A2]]28# NARROW-TREE: [[B3:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[B2]]29# NARROW-TREE: [[A4:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[A3]]30# NARROW-TREE: [[PARTIAL_SUM:%.*]]:fpr128 = ADDv4i32 killed [[B3]], killed [[A4]]31# NARROW-TREE: [[END:%.*]]:fpr32 = ADDVv4i32v killed [[PARTIAL_SUM]] 32 33# NO-TREE: [[START1:%.*]]:fpr128 = UABDLv4i16_v4i3234# NO-TREE: [[A1:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[START1]]35# NO-TREE: [[A2:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[A1]]36# NO-TREE: [[A3:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[A2]]37# NO-TREE: [[A4:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[A3]] 38# NO-TREE: [[A5:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[A4]]39# NO-TREE: [[A6:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[A5]]40# NO-TREE: [[A7:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[A6]]41# NO-TREE: [[A8:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[A7]]42# NO-TREE: [[END:%.*]]:fpr32 = ADDVv4i32v killed [[A8]]43 44---45name: uabal_accumulation46body: |47 bb.0.entry:48 liveins: $x0, $x1, $x2, $x349 50 %3:gpr64 = COPY $x351 %2:gpr64common = COPY $x252 %1:gpr64 = COPY $x153 %0:gpr64common = COPY $x054 %4:fpr64 = LDRDui %0, 0 :: (load (s64))55 %5:fpr64 = LDRDui %2, 0 :: (load (s64))56 %6:gpr64common = ADDXrr %0, %157 %7:gpr64common = ADDXrr %2, %358 %8:fpr64 = LDRDui %6, 0 :: (load (s64))59 %9:fpr64 = LDRDui %7, 0 :: (load (s64))60 %10:fpr128 = UABDLv4i16_v4i32 killed %8, killed %961 %11:fpr128 = UABALv4i16_v4i32 killed %10, killed %4, killed %562 %12:gpr64common = ADDXrr %6, %163 %13:gpr64common = ADDXrr %7, %364 %14:fpr64 = LDRDui %12, 0 :: (load (s64))65 %15:fpr64 = LDRDui %13, 0 :: (load (s64))66 %16:fpr128 = UABALv4i16_v4i32 killed %11, killed %14, killed %1567 %17:gpr64common = ADDXrr %12, %168 %18:gpr64common = ADDXrr %13, %369 %19:fpr64 = LDRDui %17, 0 :: (load (s64))70 %20:fpr64 = LDRDui %18, 0 :: (load (s64))71 %21:fpr128 = UABALv4i16_v4i32 killed %16, killed %19, killed %2072 %22:gpr64common = ADDXrr %17, %173 %23:gpr64common = ADDXrr %18, %374 %24:fpr64 = LDRDui %22, 0 :: (load (s64))75 %25:fpr64 = LDRDui %23, 0 :: (load (s64))76 %26:fpr128 = UABALv4i16_v4i32 killed %21, killed %24, killed %2577 %27:gpr64common = ADDXrr %22, %178 %28:gpr64common = ADDXrr %23, %379 %29:fpr64 = LDRDui %27, 0 :: (load (s64))80 %30:fpr64 = LDRDui %28, 0 :: (load (s64))81 %31:fpr128 = UABALv4i16_v4i32 killed %26, killed %29, killed %3082 %32:gpr64common = ADDXrr %27, %183 %33:gpr64common = ADDXrr %28, %384 %34:fpr64 = LDRDui %32, 0 :: (load (s64))85 %35:fpr64 = LDRDui %33, 0 :: (load (s64))86 %36:fpr128 = UABALv4i16_v4i32 killed %31, killed %34, killed %3587 %37:gpr64common = ADDXrr %32, %188 %38:gpr64common = ADDXrr %33, %389 %39:fpr64 = LDRDui %37, 0 :: (load (s64))90 %40:fpr64 = LDRDui %38, 0 :: (load (s64))91 %41:fpr128 = UABALv4i16_v4i32 killed %36, killed %39, killed %4092 %42:gpr64common = ADDXrr %37, %193 %43:gpr64common = ADDXrr %38, %394 %44:fpr64 = LDRDui %42, 0 :: (load (s64))95 %45:fpr64 = LDRDui %43, 0 :: (load (s64))96 %46:fpr128 = UABALv4i16_v4i32 killed %41, killed %44, killed %4597 %47:fpr32 = ADDVv4i32v killed %4698 %48:fpr128 = IMPLICIT_DEF99 %49:fpr128 = INSERT_SUBREG %48, killed %47, %subreg.ssub100 %50:gpr32all = COPY %49.ssub101 $w0 = COPY %50102 RET_ReallyLR implicit $w0103...104 105# In this test case we don't perform the reassociation because we don't recognize the106# instruction at the top of the chain.107# CHECK-LABEL: name: uabal_accumulation_with_different_start108# CHECK: [[START1:%.*]]:fpr128 = ADDv4i32109# CHECK: [[START2:%.*]]:fpr128 = UABDLv4i16_v4i32110# CHECK: [[START3:%.*]]:fpr128 = UABDLv4i16_v4i32111# CHECK: [[A1:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[START1]]112# CHECK: [[B1:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[START2]]113# CHECK: [[C1:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[START3]]114# CHECK: [[A2:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[A1]]115# CHECK: [[B2:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[B1]]116# CHECK: [[C2:%.*]]:fpr128 = UABALv4i16_v4i32 killed [[C1]]117# CHECK: [[PARTIAL_SUM:%.*]]:fpr128 = ADDv4i32 killed [[A2]], killed [[B2]]118# CHECK: [[TOTAL_SUM:%.*]]:fpr128 = ADDv4i32 killed [[PARTIAL_SUM]], killed [[C2]]119# CHECK: [[END:%.*]]:fpr32 = ADDVv4i32v killed [[TOTAL_SUM]]120 121---122name: uabal_accumulation_with_different_start123body: |124 bb.0.entry:125 liveins: $x0, $x1, $x2, $x3126 127 %3:gpr64 = COPY $x3128 %2:gpr64common = COPY $x2129 %1:gpr64 = COPY $x1130 %0:gpr64common = COPY $x0131 %4:fpr64 = LDRDui %0, 0 :: (load (s64))132 %5:fpr64 = LDRDui %2, 0 :: (load (s64))133 %6:gpr64common = ADDXrr %0, %1134 %7:gpr64common = ADDXrr %2, %3135 %8:fpr128 = LDRQui %6, 0 :: (load (s128))136 %9:fpr128 = LDRQui %7, 0 :: (load (s128))137 %10:fpr128 = ADDv4i32 killed %8, killed %9138 %11:fpr128 = UABALv4i16_v4i32 killed %10, killed %4, killed %5139 %12:gpr64common = ADDXrr %6, %1140 %13:gpr64common = ADDXrr %7, %3141 %14:fpr64 = LDRDui %12, 0 :: (load (s64))142 %15:fpr64 = LDRDui %13, 0 :: (load (s64))143 %16:fpr128 = UABALv4i16_v4i32 killed %11, killed %14, killed %15144 %17:gpr64common = ADDXrr %12, %1145 %18:gpr64common = ADDXrr %13, %3146 %19:fpr64 = LDRDui %17, 0 :: (load (s64))147 %20:fpr64 = LDRDui %18, 0 :: (load (s64))148 %21:fpr128 = UABALv4i16_v4i32 killed %16, killed %19, killed %20149 %22:gpr64common = ADDXrr %17, %1150 %23:gpr64common = ADDXrr %18, %3151 %24:fpr64 = LDRDui %22, 0 :: (load (s64))152 %25:fpr64 = LDRDui %23, 0 :: (load (s64))153 %26:fpr128 = UABALv4i16_v4i32 killed %21, killed %24, killed %25154 %27:gpr64common = ADDXrr %22, %1155 %28:gpr64common = ADDXrr %23, %3156 %29:fpr64 = LDRDui %27, 0 :: (load (s64))157 %30:fpr64 = LDRDui %28, 0 :: (load (s64))158 %31:fpr128 = UABALv4i16_v4i32 killed %26, killed %29, killed %30159 %32:gpr64common = ADDXrr %27, %1160 %33:gpr64common = ADDXrr %28, %3161 %34:fpr64 = LDRDui %32, 0 :: (load (s64))162 %35:fpr64 = LDRDui %33, 0 :: (load (s64))163 %36:fpr128 = UABALv4i16_v4i32 killed %31, killed %34, killed %35164 %37:gpr64common = ADDXrr %32, %1165 %38:gpr64common = ADDXrr %33, %3166 %39:fpr64 = LDRDui %37, 0 :: (load (s64))167 %40:fpr64 = LDRDui %38, 0 :: (load (s64))168 %41:fpr128 = UABALv4i16_v4i32 killed %36, killed %39, killed %40169 %42:gpr64common = ADDXrr %37, %1170 %43:gpr64common = ADDXrr %38, %3171 %44:fpr64 = LDRDui %42, 0 :: (load (s64))172 %45:fpr64 = LDRDui %43, 0 :: (load (s64))173 %46:fpr128 = UABALv4i16_v4i32 killed %41, killed %44, killed %45174 %47:fpr32 = ADDVv4i32v killed %46175 %48:fpr128 = IMPLICIT_DEF176 %49:fpr128 = INSERT_SUBREG %48, killed %47, %subreg.ssub177 %50:gpr32all = COPY %49.ssub178 $w0 = COPY %50179 RET_ReallyLR implicit $w0180 181...182