xref: /llvm-project/llvm/test/CodeGen/SystemZ/frame-28.mir (revision 4b61d04645a5289354b8f0884a132a70bc8b4350)
15ecd3632SJonas Paulsson# RUN: llc -mtriple=s390x-linux-gnu -start-before=prologepilog %s -o - -mcpu=z14 \
25ecd3632SJonas Paulsson# RUN:   -verify-machineinstrs 2>&1 | FileCheck %s
35ecd3632SJonas Paulsson#
45ecd3632SJonas Paulsson# Test that redundant frame addressing anchor points are removed by
55ecd3632SJonas Paulsson# MachineLateInstrsCleanup.
65ecd3632SJonas Paulsson
75ecd3632SJonas Paulsson--- |
85ecd3632SJonas Paulsson  define void @fun1() { ret void }
95ecd3632SJonas Paulsson  define void @fun2() { ret void }
105ecd3632SJonas Paulsson  define void @fun3() { ret void }
115ecd3632SJonas Paulsson  define void @fun4() { ret void }
125ecd3632SJonas Paulsson  define void @fun5() { ret void }
135ecd3632SJonas Paulsson  define void @fun6() { ret void }
145ecd3632SJonas Paulsson  define void @fun7() { ret void }
155ecd3632SJonas Paulsson  define void @fun8() { ret void }
165ecd3632SJonas Paulsson
175ecd3632SJonas Paulsson  declare i32 @foo()
185ecd3632SJonas Paulsson
195ecd3632SJonas Paulsson  @ptr = external dso_local local_unnamed_addr global ptr
205ecd3632SJonas Paulsson---
215ecd3632SJonas Paulsson
225ecd3632SJonas Paulsson# Test elimination of redundant LAYs in successor blocks.
235ecd3632SJonas Paulsson# CHECK-LABEL: fun1:
245ecd3632SJonas Paulsson# CHECK: lay %r1, 4096(%r15)
255ecd3632SJonas Paulsson# CHECK: # %bb.1:
265ecd3632SJonas Paulsson# CHECK-NOT: lay
275ecd3632SJonas Paulsson# CHECK: .LBB0_2:
285ecd3632SJonas Paulsson# CHECK-NOT: lay
295ecd3632SJonas Paulsson---
305ecd3632SJonas Paulssonname:            fun1
315ecd3632SJonas PaulssontracksRegLiveness: true
325ecd3632SJonas Paulssonstack:
335ecd3632SJonas Paulsson  - { id: 0, size: 5000 }
345ecd3632SJonas Paulsson  - { id: 1, size: 2500 }
355ecd3632SJonas Paulsson  - { id: 2, size: 2500 }
365ecd3632SJonas Paulsson
375ecd3632SJonas PaulssonmachineFunctionInfo: {}
385ecd3632SJonas Paulssonbody:             |
395ecd3632SJonas Paulsson  bb.0 (%ir-block.0):
405ecd3632SJonas Paulsson    liveins: $f16d
415ecd3632SJonas Paulsson    successors: %bb.2(0x00000001), %bb.1(0x7fffffff)
425ecd3632SJonas Paulsson
435ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
445ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
455ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
465ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
475ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
485ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.1, 0, $noreg
495ecd3632SJonas Paulsson    CHIMux undef $r0l, 3, implicit-def $cc
505ecd3632SJonas Paulsson    BRC 14, 8, %bb.2, implicit killed $cc
515ecd3632SJonas Paulsson    J %bb.1
525ecd3632SJonas Paulsson
535ecd3632SJonas Paulsson  bb.1:
545ecd3632SJonas Paulsson    liveins: $f16d
555ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.2, 0, $noreg
565ecd3632SJonas Paulsson    J %bb.2
575ecd3632SJonas Paulsson
585ecd3632SJonas Paulsson  bb.2:
595ecd3632SJonas Paulsson    liveins: $f16d
605ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.1, 0, $noreg
615ecd3632SJonas Paulsson    Return
625ecd3632SJonas Paulsson...
635ecd3632SJonas Paulsson
645ecd3632SJonas Paulsson# In this function the LAY in bb.1 will have a different offset, so the first
655ecd3632SJonas Paulsson# LAY in bb.2 must remain.
665ecd3632SJonas Paulsson# CHECK-LABEL: fun2:
675ecd3632SJonas Paulsson# CHECK: lay %r1, 4096(%r15)
685ecd3632SJonas Paulsson# CHECK: # %bb.1:
695ecd3632SJonas Paulsson# CHECK: lay %r1, 8192(%r15)
705ecd3632SJonas Paulsson# CHECK: .LBB1_2:
715ecd3632SJonas Paulsson# CHECK: lay %r1, 4096(%r15)
725ecd3632SJonas Paulsson# CHECK-NOT: lay
735ecd3632SJonas Paulsson---
745ecd3632SJonas Paulssonname:            fun2
755ecd3632SJonas PaulssontracksRegLiveness: true
765ecd3632SJonas Paulssonstack:
775ecd3632SJonas Paulsson  - { id: 0, size: 5000 }
785ecd3632SJonas Paulsson  - { id: 1, size: 5000 }
795ecd3632SJonas Paulsson  - { id: 2, size: 2500 }
805ecd3632SJonas Paulsson
815ecd3632SJonas PaulssonmachineFunctionInfo: {}
825ecd3632SJonas Paulssonbody:             |
835ecd3632SJonas Paulsson  bb.0 (%ir-block.0):
845ecd3632SJonas Paulsson    liveins: $f16d
855ecd3632SJonas Paulsson    successors: %bb.2(0x00000001), %bb.1(0x7fffffff)
865ecd3632SJonas Paulsson
875ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
885ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
895ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
905ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
915ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
925ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.1, 0, $noreg
935ecd3632SJonas Paulsson    CHIMux undef $r0l, 3, implicit-def $cc
945ecd3632SJonas Paulsson    BRC 14, 8, %bb.2, implicit killed $cc
955ecd3632SJonas Paulsson    J %bb.1
965ecd3632SJonas Paulsson
975ecd3632SJonas Paulsson  bb.1:
985ecd3632SJonas Paulsson    liveins: $f16d
995ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.2, 0, $noreg
1005ecd3632SJonas Paulsson    J %bb.2
1015ecd3632SJonas Paulsson
1025ecd3632SJonas Paulsson  bb.2:
1035ecd3632SJonas Paulsson    liveins: $f16d
1045ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.1, 0, $noreg
1055ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.1, 0, $noreg
1065ecd3632SJonas Paulsson    Return
1075ecd3632SJonas Paulsson...
1085ecd3632SJonas Paulsson
1095ecd3632SJonas Paulsson# Test case with a loop (with room for improvement: since %r1 is not clobbered
1105ecd3632SJonas Paulsson# inside the loop only the first LAY is needed).
1115ecd3632SJonas Paulsson# CHECK-LABEL: fun3:
1125ecd3632SJonas Paulsson# CHECK: lay %r1, 4096(%r15)
1135ecd3632SJonas Paulsson# CHECK: .LBB2_1:
1145ecd3632SJonas Paulsson# CHECK: lay %r1, 4096(%r15)
1155ecd3632SJonas Paulsson# CHECK: .LBB2_2:
1165ecd3632SJonas Paulsson# CHECK-NOT: lay %r1, 4096(%r15)
1175ecd3632SJonas Paulsson---
1185ecd3632SJonas Paulssonname:            fun3
1195ecd3632SJonas PaulssontracksRegLiveness: true
1205ecd3632SJonas Paulssonstack:
1215ecd3632SJonas Paulsson  - { id: 0, size: 5000 }
1225ecd3632SJonas Paulsson  - { id: 1, size: 2500 }
1235ecd3632SJonas Paulsson  - { id: 2, size: 2500 }
1245ecd3632SJonas Paulsson
1255ecd3632SJonas PaulssonmachineFunctionInfo: {}
1265ecd3632SJonas Paulssonbody:             |
1275ecd3632SJonas Paulsson  bb.0 (%ir-block.0):
1285ecd3632SJonas Paulsson    liveins: $f16d
1295ecd3632SJonas Paulsson    successors: %bb.2(0x00000001), %bb.1(0x7fffffff)
1305ecd3632SJonas Paulsson
1315ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
1325ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
1335ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
1345ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
1355ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
1365ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.1, 0, $noreg
1375ecd3632SJonas Paulsson    CHIMux undef $r0l, 3, implicit-def $cc
1385ecd3632SJonas Paulsson    BRC 14, 8, %bb.2, implicit killed $cc
1395ecd3632SJonas Paulsson    J %bb.1
1405ecd3632SJonas Paulsson
1415ecd3632SJonas Paulsson  bb.1:
1425ecd3632SJonas Paulsson    liveins: $f16d
1435ecd3632SJonas Paulsson    successors: %bb.2(0x00000001), %bb.1(0x7fffffff)
1445ecd3632SJonas Paulsson
1455ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.2, 0, $noreg
1465ecd3632SJonas Paulsson    CHIMux undef $r0l, 3, implicit-def $cc
1475ecd3632SJonas Paulsson    BRC 14, 8, %bb.1, implicit killed $cc
1485ecd3632SJonas Paulsson    J %bb.2
1495ecd3632SJonas Paulsson
1505ecd3632SJonas Paulsson  bb.2:
1515ecd3632SJonas Paulsson    liveins: $f16d
1525ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.1, 0, $noreg
1535ecd3632SJonas Paulsson    Return
1545ecd3632SJonas Paulsson...
1555ecd3632SJonas Paulsson
1565ecd3632SJonas Paulsson# Test case with a call which clobbers r1: the second LAY after the call is needed.
1575ecd3632SJonas Paulsson# CHECK-LABEL: fun4:
1585ecd3632SJonas Paulsson# CHECK: lay %r1, 4096(%r15)
1595ecd3632SJonas Paulsson# CHECK: brasl
1605ecd3632SJonas Paulsson# CHECK: lay %r1, 4096(%r15)
1615ecd3632SJonas Paulsson---
1625ecd3632SJonas Paulssonname:            fun4
1635ecd3632SJonas PaulssontracksRegLiveness: true
164*09bc6abbSJonas PaulssonframeInfo:
165*09bc6abbSJonas Paulsson  adjustsStack:    true
1665ecd3632SJonas Paulssonstack:
1675ecd3632SJonas Paulsson  - { id: 0, size: 5000 }
1685ecd3632SJonas Paulsson  - { id: 1, size: 2500 }
1695ecd3632SJonas Paulsson
1705ecd3632SJonas PaulssonmachineFunctionInfo: {}
1715ecd3632SJonas Paulssonbody:             |
1725ecd3632SJonas Paulsson  bb.0 (%ir-block.0):
1735ecd3632SJonas Paulsson    liveins: $f16d
1745ecd3632SJonas Paulsson
1755ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
1765ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
1775ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
1785ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
1795ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
1805ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.1, 0, $noreg
1815ecd3632SJonas Paulsson    CallBRASL @foo, csr_systemz_elf, implicit-def dead $r14d, implicit-def dead $cc, implicit $fpc, implicit-def $r2l
1825ecd3632SJonas Paulsson    $f17d = IMPLICIT_DEF
1835ecd3632SJonas Paulsson    VST64 renamable $f17d, %stack.1, 0, $noreg
1845ecd3632SJonas Paulsson    Return
1855ecd3632SJonas Paulsson...
1865ecd3632SJonas Paulsson
1875ecd3632SJonas Paulsson# Test case where index reg is loaded instead of using an LAY. Only one LGHI is needed.
1885ecd3632SJonas Paulsson# CHECK-LABEL: fun5:
1895ecd3632SJonas Paulsson# CHECK: lghi %r1, 4096
1905ecd3632SJonas Paulsson# CHECK-NOT: lghi
1915ecd3632SJonas Paulsson---
1925ecd3632SJonas Paulssonname:            fun5
1935ecd3632SJonas PaulssontracksRegLiveness: true
1945ecd3632SJonas Paulssonstack:
1955ecd3632SJonas Paulsson  - { id: 0, size: 5000 }
1965ecd3632SJonas Paulsson  - { id: 1, size: 2500 }
1975ecd3632SJonas Paulsson
1985ecd3632SJonas PaulssonmachineFunctionInfo: {}
1995ecd3632SJonas Paulssonbody:             |
2005ecd3632SJonas Paulsson  bb.0 (%ir-block.0):
2015ecd3632SJonas Paulsson    liveins: $f16d
2025ecd3632SJonas Paulsson
2035ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
2045ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
2055ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
2065ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
2075ecd3632SJonas Paulsson    VST64 renamable $f16d, %stack.0, 0, $noreg
2085ecd3632SJonas Paulsson    $f0q = nofpexcept LXEB %stack.1, 0, $noreg, implicit $fpc
2095ecd3632SJonas Paulsson    $f1q = nofpexcept LXEB %stack.1, 0, $noreg, implicit $fpc
2105ecd3632SJonas Paulsson    Return
2115ecd3632SJonas Paulsson...
2125ecd3632SJonas Paulsson
2135ecd3632SJonas Paulsson# Test where the constant is a Global. Only one LARL is needed.
2145ecd3632SJonas Paulsson# CHECK-LABEL: fun6:
2155ecd3632SJonas Paulsson# CHECK: larl %r1, ptr
2165ecd3632SJonas Paulsson# CHECK-NOT: larl
2175ecd3632SJonas Paulsson---
2185ecd3632SJonas Paulssonname:            fun6
2195ecd3632SJonas Paulssonalignment:       16
2205ecd3632SJonas PaulssontracksRegLiveness: true
2215ecd3632SJonas PaulssontracksDebugUserValues: true
2225ecd3632SJonas PaulssonframeInfo:
2235ecd3632SJonas Paulsson  maxAlignment:    1
2245ecd3632SJonas Paulsson  maxCallFrameSize: 0
2255ecd3632SJonas PaulssonfixedStack:
2265ecd3632SJonas Paulsson  - { id: 0, offset: -160, size: 8, alignment: 8 }
2275ecd3632SJonas PaulssonmachineFunctionInfo: {}
2285ecd3632SJonas Paulssonbody:             |
2295ecd3632SJonas Paulsson  bb.0:
2305ecd3632SJonas Paulsson    successors: %bb.2(0x30000000), %bb.1(0x50000000)
2315ecd3632SJonas Paulsson
2325ecd3632SJonas Paulsson    renamable $r1d = LARL @ptr
2335ecd3632SJonas Paulsson    CGHSI killed renamable $r1d, 0, 0, implicit-def $cc :: (volatile dereferenceable load (s64) from @ptr)
2345ecd3632SJonas Paulsson    BRC 14, 8, %bb.2, implicit killed $cc
2355ecd3632SJonas Paulsson    J %bb.1
2365ecd3632SJonas Paulsson
2375ecd3632SJonas Paulsson  bb.1:
2385ecd3632SJonas Paulsson    renamable $r1d = LARL @ptr
2395ecd3632SJonas Paulsson    MVGHI killed renamable $r1d, 0, 0
2405ecd3632SJonas Paulsson
2415ecd3632SJonas Paulsson  bb.2:
2425ecd3632SJonas Paulsson    Return
2435ecd3632SJonas Paulsson
2445ecd3632SJonas Paulsson...
2455ecd3632SJonas Paulsson
2465ecd3632SJonas Paulsson# Load of an invariant location (GOT). Only one LGRL is needed.
2475ecd3632SJonas Paulsson# CHECK-LABEL: fun7:
2485ecd3632SJonas Paulsson# CHECK: lgrl %r1, ptr
2495ecd3632SJonas Paulsson# CHECK-NOT: lgrl
2505ecd3632SJonas Paulsson---
2515ecd3632SJonas Paulssonname:            fun7
2525ecd3632SJonas Paulssonalignment:       16
2535ecd3632SJonas PaulssontracksRegLiveness: true
2545ecd3632SJonas PaulssontracksDebugUserValues: true
2555ecd3632SJonas PaulssonframeInfo:
2565ecd3632SJonas Paulsson  maxAlignment:    1
2575ecd3632SJonas Paulsson  maxCallFrameSize: 0
2585ecd3632SJonas PaulssonfixedStack:
2595ecd3632SJonas Paulsson  - { id: 0, offset: -160, size: 8, alignment: 8 }
2605ecd3632SJonas PaulssonmachineFunctionInfo: {}
2615ecd3632SJonas Paulssonbody:             |
2625ecd3632SJonas Paulsson  bb.0:
2635ecd3632SJonas Paulsson    successors: %bb.2(0x30000000), %bb.1(0x50000000)
2645ecd3632SJonas Paulsson
2655ecd3632SJonas Paulsson    renamable $r1d = LGRL @ptr :: (load (s64) from got)
2665ecd3632SJonas Paulsson    CGHSI killed renamable $r1d, 0, 0, implicit-def $cc :: (volatile dereferenceable load (s64) from @ptr)
2675ecd3632SJonas Paulsson    BRC 14, 8, %bb.2, implicit killed $cc
2685ecd3632SJonas Paulsson    J %bb.1
2695ecd3632SJonas Paulsson
2705ecd3632SJonas Paulsson  bb.1:
2715ecd3632SJonas Paulsson    renamable $r1d = LGRL @ptr :: (load (s64) from got)
2725ecd3632SJonas Paulsson    MVGHI killed renamable $r1d, 0, 0
2735ecd3632SJonas Paulsson
2745ecd3632SJonas Paulsson  bb.2:
2755ecd3632SJonas Paulsson    Return
2765ecd3632SJonas Paulsson
2775ecd3632SJonas Paulsson...
2785ecd3632SJonas Paulsson
2795ecd3632SJonas Paulsson# Load from constant pool. Only one LARL is needed.
2805ecd3632SJonas Paulsson# CHECK-LABEL: fun8:
2815ecd3632SJonas Paulsson# CHECK: larl %r1, .LCPI7_0
2825ecd3632SJonas Paulsson# CHECK-NOT: larl
2835ecd3632SJonas Paulsson---
2845ecd3632SJonas Paulssonname:            fun8
2855ecd3632SJonas Paulssonalignment:       16
2865ecd3632SJonas PaulssontracksRegLiveness: true
2875ecd3632SJonas PaulssontracksDebugUserValues: true
2885ecd3632SJonas Paulssonliveins:
2895ecd3632SJonas Paulsson  - { reg: '$f0s' }
2905ecd3632SJonas PaulssonframeInfo:
2915ecd3632SJonas Paulsson  maxAlignment:    1
2925ecd3632SJonas Paulsson  maxCallFrameSize: 0
2935ecd3632SJonas PaulssonfixedStack:
2945ecd3632SJonas Paulsson  - { id: 0, offset: -160, size: 8, alignment: 8 }
2955ecd3632SJonas Paulssonconstants:
2965ecd3632SJonas Paulsson  - id:              0
2975ecd3632SJonas Paulsson    value:           float 0x43E0000000000000
2985ecd3632SJonas Paulsson    alignment:       4
2995ecd3632SJonas PaulssonmachineFunctionInfo: {}
3005ecd3632SJonas Paulssonbody:             |
3015ecd3632SJonas Paulsson  bb.0 (%ir-block.0):
3025ecd3632SJonas Paulsson    successors: %bb.1, %bb.2
3035ecd3632SJonas Paulsson    liveins: $f0s
3045ecd3632SJonas Paulsson
3055ecd3632SJonas Paulsson    renamable $r1d = LARL %const.0
3065ecd3632SJonas Paulsson    renamable $f1s = LE killed renamable $r1d, 0, $noreg :: (load (s32) from constant-pool)
3075ecd3632SJonas Paulsson    nofpexcept CEBR renamable $f0s, renamable $f1s, implicit-def $cc, implicit $fpc
3085ecd3632SJonas Paulsson    BRC 15, 11, %bb.2, implicit killed $cc
3095ecd3632SJonas Paulsson
3105ecd3632SJonas Paulsson  bb.1:
3115ecd3632SJonas Paulsson    liveins: $f0s
3125ecd3632SJonas Paulsson
3135ecd3632SJonas Paulsson    J %bb.3
3145ecd3632SJonas Paulsson
3155ecd3632SJonas Paulsson  bb.2 (%ir-block.0):
3165ecd3632SJonas Paulsson    liveins: $f0s, $f1s
3175ecd3632SJonas Paulsson
3185ecd3632SJonas Paulsson    renamable $r1d = LARL %const.0
3195ecd3632SJonas Paulsson    renamable $f1s = LE killed renamable $r1d, 0, $noreg :: (load (s32) from constant-pool)
3205ecd3632SJonas Paulsson
3215ecd3632SJonas Paulsson  bb.3 (%ir-block.0):
3225ecd3632SJonas Paulsson    liveins: $r2d
3235ecd3632SJonas Paulsson
3245ecd3632SJonas Paulsson    Return
3255ecd3632SJonas Paulsson
3265ecd3632SJonas Paulsson...
327