By reordering the objects on the stack frame after looking at the users, a better utilization of displacement operands will result. This means less needed Load Address instructions for the accessing of these objects. This is important for very large functions where otherwise small changes could cause a lot more/less accesses go out of range. Note: this is not yet enabled for SystemZXPLINKFrameLowering, but should be. Review: Ulrich Weigand Differential Revision: https://reviews.llvm.org/D115690
234 lines
11 KiB
YAML
234 lines
11 KiB
YAML
# RUN: llc -mtriple=s390x-linux-gnu -mcpu=z14 -start-before=greedy %s -o - \
|
|
# RUN: | FileCheck %s
|
|
#
|
|
# Test folding of a memory operand into logical compare with an immediate.
|
|
|
|
--- |
|
|
define i32 @fun0(i32* %src, i32 %arg) { ret i32 0 }
|
|
define i64 @fun1(i64* %src, i64 %arg) { ret i64 0 }
|
|
define i32 @fun2(i32* %src, i32 %arg) { ret i32 0 }
|
|
define i64 @fun3(i64* %src, i64 %arg) { ret i64 0 }
|
|
...
|
|
|
|
|
|
# CHECK-LABEL: fun0:
|
|
# CHECK: mvhi 160(%r15), 0 # 4-byte Folded Spill
|
|
# CHECK: mvc 160(4,%r15), 0(%r2) # 4-byte Folded Spill
|
|
# CHECK-LABEL: .LBB0_2:
|
|
# CHECK: clfhsi 160(%r15), 2 # 4-byte Folded Reload
|
|
---
|
|
name: fun0
|
|
alignment: 16
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: grx32bit }
|
|
- { id: 1, class: grx32bit }
|
|
- { id: 2, class: addr64bit }
|
|
- { id: 3, class: gr32bit }
|
|
- { id: 4, class: grx32bit }
|
|
- { id: 5, class: grx32bit }
|
|
- { id: 6, class: gr32bit }
|
|
- { id: 7, class: gr32bit }
|
|
- { id: 8, class: grx32bit }
|
|
liveins:
|
|
- { reg: '$r2d', virtual-reg: '%2' }
|
|
- { reg: '$r3l', virtual-reg: '%3' }
|
|
frameInfo:
|
|
maxAlignment: 1
|
|
hasOpaqueSPAdjustment: true
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0:
|
|
successors: %bb.1(0x30000000), %bb.2(0x50000000)
|
|
liveins: $r2d, $r3l
|
|
|
|
%3:gr32bit = COPY $r3l
|
|
%2:addr64bit = COPY $r2d
|
|
%6:gr32bit = LHIMux 0
|
|
CHIMux %3, 0, implicit-def $cc
|
|
%8:grx32bit = LHIMux 0
|
|
BRC 14, 6, %bb.2, implicit killed $cc
|
|
J %bb.1
|
|
|
|
bb.1:
|
|
%8:grx32bit = LMux %2, 0, $noreg :: (load (s32) from %ir.src)
|
|
INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def early-clobber $r15d
|
|
|
|
bb.2:
|
|
INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def early-clobber $r15d
|
|
CLFIMux %8, 2, implicit-def $cc
|
|
%6:gr32bit = LOCHIMux %6, 1, 14, 6, implicit killed $cc
|
|
%7:gr32bit = NRK %3, %6, implicit-def dead $cc
|
|
$r2l = COPY %7
|
|
Return implicit $r2l
|
|
|
|
...
|
|
|
|
|
|
# CHECK-LABEL: fun1:
|
|
# CHECK: mvghi 160(%r15), 0 # 8-byte Folded Spill
|
|
# CHECK: mvc 160(8,%r15), 0(%r2) # 8-byte Folded Spill
|
|
# CHECK-LABEL: .LBB1_2:
|
|
# CHECK: clghsi 160(%r15), 2 # 8-byte Folded Reload
|
|
---
|
|
name: fun1
|
|
alignment: 16
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: gr64bit }
|
|
- { id: 1, class: gr64bit }
|
|
- { id: 2, class: addr64bit }
|
|
- { id: 3, class: gr64bit }
|
|
- { id: 4, class: gr64bit }
|
|
- { id: 5, class: gr64bit }
|
|
- { id: 6, class: gr64bit }
|
|
- { id: 7, class: gr64bit }
|
|
- { id: 8, class: gr64bit }
|
|
liveins:
|
|
- { reg: '$r2d', virtual-reg: '%2' }
|
|
- { reg: '$r3d', virtual-reg: '%3' }
|
|
frameInfo:
|
|
maxAlignment: 1
|
|
hasOpaqueSPAdjustment: true
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0:
|
|
successors: %bb.1(0x30000000), %bb.2(0x50000000)
|
|
liveins: $r2d, $r3d
|
|
|
|
%3:gr64bit = COPY $r3d
|
|
%2:addr64bit = COPY $r2d
|
|
%6:gr64bit = LGHI 0
|
|
CGHI %3, 0, implicit-def $cc
|
|
%8:gr64bit = LGHI 0
|
|
BRC 14, 6, %bb.2, implicit killed $cc
|
|
J %bb.1
|
|
|
|
bb.1:
|
|
%8:gr64bit = LG %2, 0, $noreg :: (load (s64) from %ir.src)
|
|
INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def early-clobber $r15d
|
|
|
|
bb.2:
|
|
INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def early-clobber $r15d
|
|
CLGFI %8, 2, implicit-def $cc
|
|
%6:gr64bit = LOCGHI %6, 1, 14, 6, implicit killed $cc
|
|
%7:gr64bit = NGRK %3, %6, implicit-def dead $cc
|
|
$r2d = COPY %7
|
|
Return implicit $r2d
|
|
|
|
...
|
|
|
|
|
|
# 17-bit immediate can not be folded
|
|
|
|
# CHECK-LABEL: fun2:
|
|
# CHECK: mvhi 160(%r15), 0 # 4-byte Folded Spill
|
|
# CHECK: mvc 160(4,%r15), 0(%r2) # 4-byte Folded Spill
|
|
# CHECK-LABEL: .LBB2_2:
|
|
# CHECK: l %r0, 160(%r15) # 4-byte Folded Reload
|
|
# CHECK: clfi %r0, 65536
|
|
---
|
|
name: fun2
|
|
alignment: 16
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: grx32bit }
|
|
- { id: 1, class: grx32bit }
|
|
- { id: 2, class: addr64bit }
|
|
- { id: 3, class: gr32bit }
|
|
- { id: 4, class: grx32bit }
|
|
- { id: 5, class: grx32bit }
|
|
- { id: 6, class: gr32bit }
|
|
- { id: 7, class: gr32bit }
|
|
- { id: 8, class: grx32bit }
|
|
liveins:
|
|
- { reg: '$r2d', virtual-reg: '%2' }
|
|
- { reg: '$r3l', virtual-reg: '%3' }
|
|
frameInfo:
|
|
maxAlignment: 1
|
|
hasOpaqueSPAdjustment: true
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0:
|
|
successors: %bb.1(0x30000000), %bb.2(0x50000000)
|
|
liveins: $r2d, $r3l
|
|
|
|
%3:gr32bit = COPY $r3l
|
|
%2:addr64bit = COPY $r2d
|
|
%6:gr32bit = LHIMux 0
|
|
CHIMux %3, 0, implicit-def $cc
|
|
%8:grx32bit = LHIMux 0
|
|
BRC 14, 6, %bb.2, implicit killed $cc
|
|
J %bb.1
|
|
|
|
bb.1:
|
|
%8:grx32bit = LMux %2, 0, $noreg :: (load (s32) from %ir.src)
|
|
INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def early-clobber $r15d
|
|
|
|
bb.2:
|
|
INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def early-clobber $r15d
|
|
CLFIMux %8, 65536, implicit-def $cc
|
|
%6:gr32bit = LOCHIMux %6, 1, 14, 6, implicit killed $cc
|
|
%7:gr32bit = NRK %3, %6, implicit-def dead $cc
|
|
$r2l = COPY %7
|
|
Return implicit $r2l
|
|
|
|
...
|
|
|
|
|
|
# 17-bit immediate can not be folded
|
|
|
|
# CHECK-LABEL: fun3:
|
|
# CHECK: mvghi 160(%r15), 0 # 8-byte Folded Spill
|
|
# CHECK: mvc 160(8,%r15), 0(%r2) # 8-byte Folded Spill
|
|
# CHECK-LABEL: .LBB3_2:
|
|
# CHECK: lg %r0, 160(%r15) # 8-byte Folded Reload
|
|
# CHECK: clgfi %r0, 65536
|
|
---
|
|
name: fun3
|
|
alignment: 16
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: gr64bit }
|
|
- { id: 1, class: gr64bit }
|
|
- { id: 2, class: addr64bit }
|
|
- { id: 3, class: gr64bit }
|
|
- { id: 4, class: gr64bit }
|
|
- { id: 5, class: gr64bit }
|
|
- { id: 6, class: gr64bit }
|
|
- { id: 7, class: gr64bit }
|
|
- { id: 8, class: gr64bit }
|
|
liveins:
|
|
- { reg: '$r2d', virtual-reg: '%2' }
|
|
- { reg: '$r3d', virtual-reg: '%3' }
|
|
frameInfo:
|
|
maxAlignment: 1
|
|
hasOpaqueSPAdjustment: true
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0:
|
|
successors: %bb.1(0x30000000), %bb.2(0x50000000)
|
|
liveins: $r2d, $r3d
|
|
|
|
%3:gr64bit = COPY $r3d
|
|
%2:addr64bit = COPY $r2d
|
|
%6:gr64bit = LGHI 0
|
|
CGHI %3, 0, implicit-def $cc
|
|
%8:gr64bit = LGHI 0
|
|
BRC 14, 6, %bb.2, implicit killed $cc
|
|
J %bb.1
|
|
|
|
bb.1:
|
|
%8:gr64bit = LG %2, 0, $noreg :: (load (s64) from %ir.src)
|
|
INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def early-clobber $r15d
|
|
|
|
bb.2:
|
|
INLINEASM &"", 1, 12, implicit-def dead early-clobber $r0d, 12, implicit-def dead early-clobber $r1d, 12, implicit-def dead early-clobber $r2d, 12, implicit-def dead early-clobber $r3d, 12, implicit-def dead early-clobber $r4d, 12, implicit-def dead early-clobber $r5d, 12, implicit-def dead early-clobber $r6d, 12, implicit-def dead early-clobber $r7d, 12, implicit-def dead early-clobber $r8d, 12, implicit-def dead early-clobber $r9d, 12, implicit-def dead early-clobber $r10d, 12, implicit-def dead early-clobber $r11d, 12, implicit-def dead early-clobber $r12d, 12, implicit-def dead early-clobber $r13d, 12, implicit-def dead early-clobber $r14d, 12, implicit-def early-clobber $r15d
|
|
CLGFI %8, 65536, implicit-def $cc
|
|
%6:gr64bit = LOCGHI %6, 1, 14, 6, implicit killed $cc
|
|
%7:gr64bit = NGRK %3, %6, implicit-def dead $cc
|
|
$r2d = COPY %7
|
|
Return implicit $r2d
|
|
|
|
...
|