The current MIR cycle sinking capabilities are rather limited. It only support sinking copies into a single successor block while obeying limits. This opt-in feature adds a more aggressive option, that is not limited to the above concerns. The feature will try to "sink" by duplicating any top-level preheader instruction (that we are sure is safe to sink) into any user block, then does some dead code cleanup. In particular, this is useful for high RP situations when loop bodies have control flow.
78 lines
2.7 KiB
YAML
78 lines
2.7 KiB
YAML
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
|
|
# RUN: llc -mtriple=s390x-linux-gnu -sink-insts-to-avoid-spills -verify-machineinstrs -run-pass=machine-sink -o - %s | FileCheck %s
|
|
|
|
# Test kill flags are cleared after sinking operations into cycle during MachineLICM.
|
|
|
|
--- |
|
|
target datalayout = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64"
|
|
target triple = "s390x-unknown-linux-gnu"
|
|
|
|
%0 = type <{ i32, [3 x i8] }>
|
|
|
|
@b = external dso_local global [1 x %0], align 2
|
|
|
|
define dso_local void @c() local_unnamed_addr {
|
|
ret void
|
|
}
|
|
|
|
...
|
|
---
|
|
name: c
|
|
tracksRegLiveness: true
|
|
body: |
|
|
; CHECK-LABEL: name: c
|
|
; CHECK: bb.0:
|
|
; CHECK-NEXT: successors: %bb.1(0x80000000)
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: [[LARL:%[0-9]+]]:addr64bit = LARL @b
|
|
; CHECK-NEXT: [[LA:%[0-9]+]]:gr64bit = LA killed [[LARL]], 49, $noreg
|
|
; CHECK-NEXT: [[LGHI:%[0-9]+]]:gr64bit = LGHI 7
|
|
; CHECK-NEXT: [[DEF:%[0-9]+]]:gr64bit = IMPLICIT_DEF
|
|
; CHECK-NEXT: [[DEF1:%[0-9]+]]:gr64bit = IMPLICIT_DEF
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: bb.1:
|
|
; CHECK-NEXT: successors: %bb.1(0x80000000)
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64bit = COPY [[LA]]
|
|
; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0
|
|
; CHECK-NEXT: $r2d = COPY [[DEF]]
|
|
; CHECK-NEXT: $r3d = COPY [[COPY]]
|
|
; CHECK-NEXT: $r4d = COPY [[LGHI]]
|
|
; CHECK-NEXT: CallBRASL &memcpy, $r2d, $r3d, $r4d, csr_systemz_elf, implicit-def dead $r14d, implicit-def dead $cc, implicit $fpc, implicit-def $r2d
|
|
; CHECK-NEXT: ADJCALLSTACKUP 0, 0
|
|
; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0
|
|
; CHECK-NEXT: $r2d = COPY [[DEF1]]
|
|
; CHECK-NEXT: $r3d = COPY [[COPY]]
|
|
; CHECK-NEXT: $r4d = COPY [[LGHI]]
|
|
; CHECK-NEXT: CallBRASL &memcpy, $r2d, $r3d, $r4d, csr_systemz_elf, implicit-def dead $r14d, implicit-def dead $cc, implicit $fpc, implicit-def $r2d
|
|
; CHECK-NEXT: ADJCALLSTACKUP 0, 0
|
|
; CHECK-NEXT: J %bb.1
|
|
bb.0:
|
|
successors: %bb.1(0x80000000)
|
|
|
|
%1:addr64bit = LARL @b
|
|
%0:gr64bit = LA killed %1, 49, $noreg
|
|
%2:gr64bit = LGHI 7
|
|
%3:gr64bit = IMPLICIT_DEF
|
|
%5:gr64bit = IMPLICIT_DEF
|
|
%6:gr64bit = COPY killed %0
|
|
|
|
bb.1:
|
|
successors: %bb.1(0x80000000)
|
|
|
|
ADJCALLSTACKDOWN 0, 0
|
|
$r2d = COPY %3
|
|
$r3d = COPY %6
|
|
$r4d = COPY %2
|
|
CallBRASL &memcpy, $r2d, $r3d, $r4d, csr_systemz_elf, implicit-def dead $r14d, implicit-def dead $cc, implicit $fpc, implicit-def $r2d
|
|
ADJCALLSTACKUP 0, 0
|
|
ADJCALLSTACKDOWN 0, 0
|
|
$r2d = COPY %5
|
|
$r3d = COPY %6
|
|
$r4d = COPY %2
|
|
CallBRASL &memcpy, $r2d, $r3d, $r4d, csr_systemz_elf, implicit-def dead $r14d, implicit-def dead $cc, implicit $fpc, implicit-def $r2d
|
|
ADJCALLSTACKUP 0, 0
|
|
J %bb.1
|
|
|
|
...
|