On SystemZ, the outgoing argument area which is big enough for all calls in the function is created once during the prolog, as opposed to adjusting the stack around each call. The call-sequence instructions are therefore not really useful any more than to compute the maximum call frame size, which has so far been done by PEI, but can just as well be done at an earlier point. This patch removes the mapping of the CallFrameSetupOpcode and CallFrameDestroyOpcode and instead computes the MaxCallFrameSize directly after instruction selection and then removes the ADJCALLSTACK pseudos. This removes the confusing pseudos and also avoids the problem of having to keep the call frame size accurate when creating new MBBs. This fixes #76618 which exposed the need to maintain the call frame size when splitting blocks (which was not done).
179 lines
5.4 KiB
YAML
179 lines
5.4 KiB
YAML
# RUN: llc -mtriple=s390x-linux-gnu -mcpu=z15 -start-before=greedy %s -o - \
|
|
# RUN: | FileCheck %s
|
|
#
|
|
# Test that regalloc manages (via regalloc hints) to avoid a LOCRMux jump
|
|
# sequence expansion, and a SELR/LOCR instuction is emitted.
|
|
|
|
--- |
|
|
; ModuleID = 'tc.ll'
|
|
source_filename = "tc.ll"
|
|
target datalayout = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64"
|
|
|
|
@globvar = external global i32
|
|
|
|
declare void @fun() #0
|
|
|
|
define void @fun1() #0 {
|
|
bb5:
|
|
br label %bb6
|
|
|
|
bb6: ; preds = %bb33, %bb5
|
|
%tmp = phi i1 [ %tmp34, %bb33 ], [ undef, %bb5 ]
|
|
br label %bb7
|
|
|
|
bb7: ; preds = %bb7, %bb6
|
|
%lsr.iv1 = phi ptr [ %0, %bb7 ], [ undef, %bb6 ]
|
|
%tmp8 = phi i32 [ %tmp27, %bb7 ], [ -1000000, %bb6 ]
|
|
%tmp9 = phi i64 [ %tmp28, %bb7 ], [ 0, %bb6 ]
|
|
%lsr3 = trunc i64 %tmp9 to i32
|
|
%lsr.iv12 = bitcast ptr %lsr.iv1 to ptr
|
|
%tmp11 = load i32, ptr %lsr.iv12
|
|
%tmp12 = icmp sgt i32 %tmp11, undef
|
|
%tmp13 = trunc i64 %tmp9 to i32
|
|
%tmp14 = select i1 %tmp12, i32 %lsr3, i32 0
|
|
%tmp15 = select i1 %tmp12, i32 %tmp13, i32 %tmp8
|
|
%tmp16 = load i32, ptr undef
|
|
%tmp17 = select i1 false, i32 undef, i32 %tmp14
|
|
%tmp18 = select i1 false, i32 undef, i32 %tmp15
|
|
%tmp19 = select i1 false, i32 %tmp16, i32 undef
|
|
%tmp20 = select i1 undef, i32 undef, i32 %tmp17
|
|
%tmp21 = select i1 undef, i32 undef, i32 %tmp18
|
|
%tmp22 = select i1 undef, i32 undef, i32 %tmp19
|
|
%tmp23 = or i64 %tmp9, 3
|
|
%tmp24 = icmp sgt i32 undef, %tmp22
|
|
%tmp25 = trunc i64 %tmp23 to i32
|
|
%tmp26 = select i1 %tmp24, i32 %tmp25, i32 %tmp20
|
|
%tmp27 = select i1 %tmp24, i32 %tmp25, i32 %tmp21
|
|
%tmp28 = add nuw nsw i64 %tmp9, 4
|
|
%tmp29 = icmp eq i64 undef, 0
|
|
%scevgep = getelementptr [512 x i32], ptr %lsr.iv1, i64 0, i64 4
|
|
%0 = bitcast ptr %scevgep to ptr
|
|
br i1 %tmp29, label %bb30, label %bb7
|
|
|
|
bb30: ; preds = %bb7
|
|
%tmp32 = icmp sgt i32 %tmp27, -1000000
|
|
br i1 %tmp32, label %bb33, label %bb35
|
|
|
|
bb33: ; preds = %bb30
|
|
call void @fun()
|
|
store i32 %tmp26, ptr @globvar
|
|
%tmp34 = icmp ugt i32 undef, 1
|
|
br label %bb6
|
|
|
|
bb35: ; preds = %bb30
|
|
br i1 %tmp, label %bb37, label %bb38
|
|
|
|
bb37: ; preds = %bb35
|
|
unreachable
|
|
|
|
bb38: ; preds = %bb35
|
|
unreachable
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @llvm.stackprotector(ptr, ptr) #1
|
|
|
|
attributes #0 = { "target-cpu"="z15" }
|
|
attributes #1 = { nounwind }
|
|
|
|
...
|
|
|
|
# CHECK: locr
|
|
# CHECK-NOT: risblg
|
|
|
|
---
|
|
name: fun1
|
|
alignment: 16
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: grx32bit }
|
|
- { id: 1, class: addr64bit }
|
|
- { id: 2, class: grx32bit }
|
|
- { id: 3, class: addr64bit }
|
|
- { id: 4, class: gr32bit }
|
|
- { id: 5, class: grx32bit }
|
|
- { id: 6, class: gr64bit }
|
|
- { id: 7, class: gr64bit }
|
|
- { id: 8, class: grx32bit }
|
|
- { id: 9, class: grx32bit }
|
|
- { id: 10, class: gr64bit }
|
|
- { id: 11, class: grx32bit }
|
|
- { id: 12, class: gr64bit }
|
|
- { id: 13, class: grx32bit }
|
|
- { id: 14, class: gr32bit }
|
|
- { id: 15, class: gr32bit }
|
|
- { id: 16, class: grx32bit }
|
|
- { id: 17, class: grx32bit }
|
|
- { id: 18, class: gr32bit }
|
|
- { id: 19, class: addr64bit }
|
|
- { id: 20, class: grx32bit }
|
|
- { id: 21, class: gr32bit }
|
|
- { id: 22, class: gr64bit }
|
|
- { id: 23, class: grx32bit }
|
|
- { id: 24, class: grx32bit }
|
|
- { id: 25, class: grx32bit }
|
|
- { id: 26, class: addr64bit }
|
|
- { id: 27, class: grx32bit }
|
|
- { id: 28, class: addr64bit }
|
|
frameInfo:
|
|
adjustsStack: true
|
|
hasCalls: true
|
|
body: |
|
|
bb.0.bb5:
|
|
%25:grx32bit = IMPLICIT_DEF
|
|
|
|
bb.1.bb6:
|
|
%28:addr64bit = LGHI 0
|
|
%27:grx32bit = IIFMux 4293967296
|
|
%26:addr64bit = IMPLICIT_DEF
|
|
|
|
bb.2.bb7:
|
|
successors: %bb.3(0x04000000), %bb.2(0x7c000000)
|
|
|
|
%14:gr32bit = LMux %26, 0, $noreg :: (load (s32) from %ir.lsr.iv12)
|
|
CR %14, undef %15:gr32bit, implicit-def $cc
|
|
%16:grx32bit = COPY %28.subreg_l32
|
|
%16:grx32bit = LOCHIMux %16, 0, 14, 12, implicit $cc
|
|
%17:grx32bit = SELRMux %27, %28.subreg_l32, 14, 2, implicit killed $cc
|
|
%18:gr32bit = LMux undef %19:addr64bit, 0, $noreg :: (load (s32) from `ptr undef`)
|
|
%20:grx32bit = COPY %28.subreg_l32
|
|
%20:grx32bit = OILMux %20, 3, implicit-def dead $cc
|
|
CR undef %21:gr32bit, %18, implicit-def $cc
|
|
%4:gr32bit = SELRMux %16, %20, 14, 2, implicit $cc
|
|
%27:grx32bit = SELRMux %17, %20, 14, 2, implicit killed $cc
|
|
%28:addr64bit = nuw nsw LA %28, 4, $noreg
|
|
%26:addr64bit = LA %26, 16, $noreg
|
|
CGHI undef %22:gr64bit, 0, implicit-def $cc
|
|
BRC 14, 6, %bb.2, implicit killed $cc
|
|
J %bb.3
|
|
|
|
bb.3.bb30:
|
|
successors: %bb.4(0x7fffffff), %bb.5(0x00000001)
|
|
|
|
CFIMux %27, -999999, implicit-def $cc
|
|
BRC 14, 4, %bb.5, implicit killed $cc
|
|
J %bb.4
|
|
|
|
bb.4.bb33:
|
|
CallBRASL @fun, csr_systemz_elf, implicit-def dead $r14d, implicit-def dead $cc
|
|
STRL %4, @globvar :: (store (s32) into @globvar)
|
|
CLFIMux undef %23:grx32bit, 1, implicit-def $cc
|
|
%25:grx32bit = LHIMux 0
|
|
%25:grx32bit = LOCHIMux %25, 1, 14, 2, implicit killed $cc
|
|
J %bb.1
|
|
|
|
bb.5.bb35:
|
|
successors: %bb.6, %bb.7
|
|
|
|
TMLMux %25, 1, implicit-def $cc
|
|
BRC 15, 8, %bb.7, implicit killed $cc
|
|
J %bb.6
|
|
|
|
bb.6.bb37:
|
|
successors:
|
|
|
|
|
|
bb.7.bb38:
|
|
|
|
...
|