CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
214 lines
8.9 KiB
YAML
214 lines
8.9 KiB
YAML
# RUN: llc -o - %s -mtriple=s390x-linux-gnu -mcpu=z16 -verify-machineinstrs \
|
|
# RUN: -run-pass=machine-scheduler -debug-only=machine-scheduler 2>&1\
|
|
# RUN: | FileCheck %s
|
|
# REQUIRES: asserts
|
|
|
|
# This function has two long independent chains of instructions that should be interleaved.
|
|
# CHECK: ********** MI Scheduling **********
|
|
# CHECK-NEXT: fun0:%bb.0
|
|
# CHECK: ********** MI Scheduling **********
|
|
# CHECK-NEXT: fun0:%bb.1
|
|
# CHECK: Number of nodes in def-use sequences: 10. Latency scheduling enabled for data sequences.
|
|
# CHECK: *** Final schedule for %bb.1 ***
|
|
# CHECK-NEXT: SU(0): %4:fp64bit = LZDR
|
|
# CHECK-NEXT: SU(5): %9:fp64bit = LZDR
|
|
# CHECK-NEXT: SU(1): %5:fp64bit = nofpexcept WFMADB %0:fp64bit, %1:fp64bit, %4:fp64bit, implicit $fpc
|
|
# CHECK-NEXT: SU(6): %10:fp64bit = nofpexcept WFMADB %2:fp64bit, %3:fp64bit, %9:fp64bit, implicit $fpc
|
|
# CHECK-NEXT: SU(2): %6:fp64bit = nofpexcept WFMADB %0:fp64bit, %1:fp64bit, %5:fp64bit, implicit $fpc
|
|
# CHECK-NEXT: SU(7): %11:fp64bit = nofpexcept WFMADB %2:fp64bit, %3:fp64bit, %10:fp64bit, implicit $fpc
|
|
# CHECK-NEXT: SU(3): %7:fp64bit = nofpexcept WFMADB %0:fp64bit, %1:fp64bit, %6:fp64bit, implicit $fpc
|
|
# CHECK-NEXT: SU(8): %12:fp64bit = nofpexcept WFMADB %2:fp64bit, %3:fp64bit, %11:fp64bit, implicit $fpc
|
|
# CHECK-NEXT: SU(4): %8:fp64bit = nofpexcept WFMADB %0:fp64bit, %1:fp64bit, %7:fp64bit, implicit $fpc
|
|
# CHECK-NEXT: SU(9): %13:fp64bit = nofpexcept WFMADB %2:fp64bit, %3:fp64bit, %12:fp64bit, implicit $fpc
|
|
# CHECK-NEXT: SU(10): %14:vr64bit = nofpexcept WFADB %8:fp64bit, %13:fp64bit, implicit $fpc
|
|
# CHECK-NEXT: SU(11): VST64 %14:vr64bit, $noreg, 0, $noreg :: (store (s128) into `ptr null`, align 8)
|
|
---
|
|
name: fun0
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $f0d, $f2d, $f4d, $f6d
|
|
|
|
%0:fp64bit = COPY $f0d
|
|
%1:fp64bit = COPY $f2d
|
|
%2:fp64bit = COPY $f4d
|
|
%3:fp64bit = COPY $f6d
|
|
|
|
bb.1:
|
|
%4:fp64bit = LZDR
|
|
%5:fp64bit = nofpexcept WFMADB %0, %1, %4, implicit $fpc
|
|
%6:fp64bit = nofpexcept WFMADB %0, %1, %5, implicit $fpc
|
|
%7:fp64bit = nofpexcept WFMADB %0, %1, %6, implicit $fpc
|
|
%8:fp64bit = nofpexcept WFMADB %0, %1, %7, implicit $fpc
|
|
%9:fp64bit = LZDR
|
|
%10:fp64bit = nofpexcept WFMADB %2, %3, %9, implicit $fpc
|
|
%11:fp64bit = nofpexcept WFMADB %2, %3, %10, implicit $fpc
|
|
%12:fp64bit = nofpexcept WFMADB %2, %3, %11, implicit $fpc
|
|
%13:fp64bit = nofpexcept WFMADB %2, %3, %12, implicit $fpc
|
|
%14:vr64bit = nofpexcept WFADB %8, %13, implicit $fpc
|
|
VST64 %14, $noreg, 0, $noreg :: (store (s128) into `ptr null`, align 8)
|
|
Return
|
|
...
|
|
|
|
# This function has a data flow sequence and latency scheduling puts the WFDDB high.
|
|
# CHECK: ********** MI Scheduling **********
|
|
# CHECK-NEXT: fun1:%bb.0
|
|
# CHECK: Number of nodes in def-use sequences: 4. Latency scheduling enabled for data sequences.
|
|
# CHECK: *** Final schedule for %bb.0 ***
|
|
# CHECK-NEXT: SU(1): undef %1.subreg_h64:vr128bit = WFDDB undef %2:fp64bit, undef %3:fp64bit, implicit $fpc
|
|
# CHECK-NEXT: SU(2): %4:fp64bit = COPY %1.subreg_h64:vr128bit
|
|
# CHECK-NEXT: SU(3): %5:fp64bit = WFADB %4:fp64bit, %4:fp64bit, implicit $fpc
|
|
# CHECK-NEXT: SU(0): dead %0:fp64bit = LZDR
|
|
# CHECK-NEXT: SU(4): VST64 %5:fp64bit, $noreg, 0, $noreg :: (store (s128) into `ptr null`, align 8)
|
|
---
|
|
name: fun1
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
%0:fp64bit = LZDR
|
|
undef %1.subreg_h64:vr128bit = WFDDB undef %2:fp64bit, undef %3:fp64bit, implicit $fpc
|
|
%4:fp64bit = COPY %1.subreg_h64:vr128bit
|
|
%5:fp64bit = WFADB %4, %4, implicit $fpc
|
|
VST64 %5:fp64bit , $noreg, 0, $noreg :: (store (s128) into `ptr null`, align 8)
|
|
Return
|
|
...
|
|
|
|
# Same, but there is no sequence, so no latency scheduling is done.
|
|
# CHECK: ********** MI Scheduling **********
|
|
# CHECK-NEXT: fun2:%bb.0
|
|
# CHECK: Latency scheduling not enabled for data sequences.
|
|
# CHECK: *** Final schedule for %bb.0 ***
|
|
# CHECK-NEXT: SU(0): dead %0:fp64bit = LZDR
|
|
# CHECK-NEXT: SU(1): undef %1.subreg_h64:vr128bit = WFDDB undef %2:fp64bit, undef %3:fp64bit, implicit $fpc
|
|
# CHECK-NEXT: SU(2): VST64 %1.subreg_h64:vr128bit, $noreg, 0, $noreg :: (store (s128) into `ptr null`, align 8)
|
|
---
|
|
name: fun2
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
%0:fp64bit = LZDR
|
|
undef %1.subreg_h64:vr128bit = WFDDB undef %2:fp64bit, undef %3:fp64bit, implicit $fpc
|
|
VST64 %1.subreg_h64:vr128bit , $noreg, 0, $noreg :: (store (s128) into `ptr null`, align 8)
|
|
Return
|
|
...
|
|
|
|
# Use the GenericScheduler latency heuristic for this single block loop.
|
|
# CHECK: ********** MI Scheduling **********
|
|
# CHECK-NEXT: fun3:%bb.1
|
|
# CHECK: Latency scheduling not enabled for data sequences.
|
|
# CHECK: ACYCLIC LATENCY LIMIT
|
|
# CHECK: Pick Bot BOT-HEIGHT [pre-RA]
|
|
---
|
|
name: fun3
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
%19:vr128bit = VREPIF 1
|
|
|
|
bb.1:
|
|
%3:gr64bit = VLGVF %19, $noreg, 0
|
|
%6:gr64bit = LLGFR %3.subreg_l32
|
|
%6:gr64bit = MSGFI %6, 274877907
|
|
%7:gr64bit = SRLG %6, $noreg, 39
|
|
%9:gr64bit = VLGVF %19, $noreg, 1
|
|
%12:gr64bit = LLGFR %9.subreg_l32
|
|
%12:gr64bit = MSGFI %12, 274877907
|
|
%13:gr64bit = SRLG %12, $noreg, 39
|
|
%15:vr128bit = VLVGP %13, %13
|
|
%15:vr128bit = VLVGF %15, %7.subreg_l32, $noreg, 0
|
|
%16:vr128bit = VUPLHF %15
|
|
%17:vr128bit = nofpexcept VCDLGB %16, 0, 0, implicit $fpc
|
|
%19:vr128bit = VGBM 0
|
|
%18:vr128bit = nofpexcept VFMDB %17, %19, implicit $fpc
|
|
VST %18, $noreg, 0, $noreg :: (store (s128) into `ptr null`, align 8)
|
|
J %bb.1
|
|
...
|
|
|
|
# This region has many nodes compared to the maximum height - the DAG is
|
|
# "wide". Don't interleave the data flows in cases like this, as it could
|
|
# result in too much ILP and spilling.
|
|
# CHECK: ********** MI Scheduling **********
|
|
# CHECK-NEXT: fun4:%bb.0
|
|
# CHECK: Latency scheduling not enabled for data sequences.
|
|
# CHECK: *** Final schedule for %bb.0 ***
|
|
# CHECK-NEXT: SU(0): %0:gr64bit = COPY undef %1:gr64bit
|
|
# CHECK-NEXT: SU(1): dead %2:gr64bit = AGRK %0:gr64bit, %0:gr64bit,
|
|
# CHECK-NEXT: SU(2): %3:gr64bit = COPY undef %1:gr64bit
|
|
# CHECK-NEXT: SU(3): dead %4:gr64bit = AGRK %3:gr64bit, %3:gr64bit,
|
|
# CHECK-NEXT: SU(4): %5:gr64bit = COPY undef %1:gr64bit
|
|
# CHECK-NEXT: SU(5): dead %6:gr64bit = AGRK %5:gr64bit, %5:gr64bit,
|
|
# CHECK-NEXT: SU(6): %7:gr64bit = COPY undef %1:gr64bit
|
|
# CHECK-NEXT: SU(7): dead %8:gr64bit = AGRK %7:gr64bit, %7:gr64bit,
|
|
# CHECK-NEXT: SU(8): %9:gr64bit = COPY undef %1:gr64bit
|
|
# CHECK-NEXT: SU(9): dead %10:gr64bit = AGRK %9:gr64bit, %9:gr64bit,
|
|
# CHECK-NEXT: SU(10): %11:gr64bit = COPY undef %1:gr64bit
|
|
# CHECK-NEXT: SU(11): dead %12:gr64bit = AGRK %11:gr64bit, %11:gr64bit,
|
|
---
|
|
name: fun4
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
%1:gr64bit = COPY undef %0:gr64bit
|
|
%2:gr64bit = AGRK %1, %1, implicit-def dead $cc
|
|
%3:gr64bit = COPY undef %0:gr64bit
|
|
%4:gr64bit = AGRK %3, %3, implicit-def dead $cc
|
|
%5:gr64bit = COPY undef %0:gr64bit
|
|
%6:gr64bit = AGRK %5, %5, implicit-def dead $cc
|
|
%7:gr64bit = COPY undef %0:gr64bit
|
|
%8:gr64bit = AGRK %7, %7, implicit-def dead $cc
|
|
%9:gr64bit = COPY undef %0:gr64bit
|
|
%10:gr64bit = AGRK %9, %9, implicit-def dead $cc
|
|
%11:gr64bit = COPY undef %0:gr64bit
|
|
%12:gr64bit = AGRK %11, %11, implicit-def dead $cc
|
|
Return
|
|
...
|
|
|
|
# The TMLL64 should be scheduled first even though the LA is available and of
|
|
# lesser height, because the TMLL64 Depth equals the remaining latency (on CP).
|
|
# CHECK: ********** MI Scheduling **********
|
|
# CHECK-NEXT: fun5:%bb.0
|
|
# CHECK: ********** MI Scheduling **********
|
|
# CHECK-NEXT: fun5:%bb.1
|
|
# CHECK: Number of nodes in def-use sequences: 4. Latency scheduling enabled for data sequences.
|
|
# CHECK: SU(0): dead %2:addr64bit = LA %0:addr64bit, 1, $noreg
|
|
# CHECK-NEXT: # preds left : 0
|
|
# CHECK-NEXT: # succs left : 0
|
|
# CHECK-NEXT: # rdefs left : 0
|
|
# CHECK-NEXT: Latency : 1
|
|
# CHECK-NEXT: Depth : 0
|
|
# CHECK-NEXT: Height : 0
|
|
# CHECK: SU(4): TMLL64 %5:gr64bit, 1, implicit-def $cc
|
|
# CHECK-NEXT: # preds left : 1
|
|
# CHECK-NEXT: # succs left : 1
|
|
# CHECK-NEXT: # rdefs left : 0
|
|
# CHECK-NEXT: Latency : 1
|
|
# CHECK-NEXT: Depth : 3
|
|
# CHECK-NEXT: Height : 1
|
|
# CHECK: Queue BotQ.A: 0 4
|
|
# CHECK: *** Final schedule for %bb.1 ***
|
|
# CHECK-NEXT: SU(1): %3:gr64bit = COPY %1:gr32bit
|
|
# CHECK-NEXT: SU(2): %4:gr64bit = COPY %3:gr64bit
|
|
# CHECK-NEXT: SU(3): %5:gr64bit = COPY %4:gr64bit
|
|
# CHECK-NEXT: SU(0): dead %2:addr64bit = LA %0:addr64bit, 1, $noreg
|
|
# CHECK-NEXT: SU(4): TMLL64 %5:gr64bit, 1, implicit-def $cc
|
|
---
|
|
name: fun5
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $r2d, $r3l
|
|
|
|
%0:addr64bit = COPY $r2d
|
|
%1:gr32bit = COPY $r3l
|
|
|
|
bb.1:
|
|
%2:addr64bit = LA %0, 1, $noreg
|
|
%3:gr64bit = COPY %1
|
|
%4:gr64bit = COPY %3
|
|
%5:gr64bit = COPY %4
|
|
TMLL64 %5, 1, implicit-def $cc
|
|
BRC 15, 7, %bb.1, implicit killed $cc
|
|
Return
|
|
...
|
|
|