brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.0 KiB · 40ba264 Raw
67 lines · plain
1; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s2 3; Parameter with swiftself should be allocated to r10.4; CHECK-LABEL: swiftself_param:5; CHECK: lgr %r2, %r106define ptr@swiftself_param(ptr swiftself %addr0) {7  ret ptr %addr08}9 10; Check that r10 is used to pass a swiftself argument.11; CHECK-LABEL: call_swiftself:12; CHECK: lgr %r10, %r213; CHECK: brasl %r14, swiftself_param14define ptr@call_swiftself(ptr %arg) {15  %res = call ptr@swiftself_param(ptr swiftself %arg)16  ret ptr %res17}18 19; r10 should be saved by the callee even if used for swiftself20; CHECK-LABEL: swiftself_clobber:21; CHECK: stmg %r10,22; ...23; CHECK: lmg %r10,24; CHECK: br %r1425define ptr@swiftself_clobber(ptr swiftself %addr0) {26  call void asm sideeffect "", "~{r10}"()27  ret ptr %addr028}29 30; Demonstrate that we do not need any loads when calling multiple functions31; with swiftself argument.32; CHECK-LABEL: swiftself_passthrough:33; CHECK-NOT: lg{{.*}}r10,34; CHECK: brasl %r14, swiftself_param35; CHECK-NOT: lg{{.*}}r10,36; CHECK-NEXT: brasl %r14, swiftself_param37define void @swiftself_passthrough(ptr swiftself %addr0) {38  call ptr@swiftself_param(ptr swiftself %addr0)39  call ptr@swiftself_param(ptr swiftself %addr0)40  ret void41}42 43; Normally, we can use a tail call if the callee swiftself is the same as the44; caller one. Not yet supported on SystemZ.45; CHECK-LABEL: swiftself_tail:46; CHECK: lgr %r[[REG1:[0-9]+]], %r1047; CHECK: lgr %r10, %r[[REG1]]48; CHECK: brasl %r14, swiftself_param49; CHECK: br %r1450define ptr @swiftself_tail(ptr swiftself %addr0) {51  call void asm sideeffect "", "~{r10}"()52  %res = tail call ptr @swiftself_param(ptr swiftself %addr0)53  ret ptr %res54}55 56; We can not use a tail call if the callee swiftself is not the same as the57; caller one.58; CHECK-LABEL: swiftself_notail:59; CHECK: lgr %r10, %r260; CHECK: brasl %r14, swiftself_param61; CHECK: lmg %r10,62; CHECK: br %r1463define ptr @swiftself_notail(ptr swiftself %addr0, ptr %addr1) nounwind {64  %res = tail call ptr @swiftself_param(ptr swiftself %addr1)65  ret ptr %res66}67