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