1*9880d681SAndroid Build Coastguard Worker# RUN: llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o - %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker# This test ensures that the MIR parser parses the callee saved register mask 3*9880d681SAndroid Build Coastguard Worker# correctly and that the MIR parser can infer it as well. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker--- | 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker define i32 @compute(i32 %a) #0 { 8*9880d681SAndroid Build Coastguard Worker body: 9*9880d681SAndroid Build Coastguard Worker %c = mul i32 %a, 11 10*9880d681SAndroid Build Coastguard Worker ret i32 %c 11*9880d681SAndroid Build Coastguard Worker } 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker define i32 @foo(i32 %a) #0 { 14*9880d681SAndroid Build Coastguard Worker entry: 15*9880d681SAndroid Build Coastguard Worker %b = call i32 @compute(i32 %a) 16*9880d681SAndroid Build Coastguard Worker ret i32 %b 17*9880d681SAndroid Build Coastguard Worker } 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker define i32 @bar(i32 %a) #0 { 20*9880d681SAndroid Build Coastguard Worker entry: 21*9880d681SAndroid Build Coastguard Worker %b = call i32 @compute(i32 %a) 22*9880d681SAndroid Build Coastguard Worker ret i32 %b 23*9880d681SAndroid Build Coastguard Worker } 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker define i32 @empty(i32 %a) #0 { 26*9880d681SAndroid Build Coastguard Worker entry: 27*9880d681SAndroid Build Coastguard Worker %b = call i32 @compute(i32 %a) 28*9880d681SAndroid Build Coastguard Worker ret i32 %b 29*9880d681SAndroid Build Coastguard Worker } 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker attributes #0 = { "no-frame-pointer-elim"="false" } 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker... 34*9880d681SAndroid Build Coastguard Worker--- 35*9880d681SAndroid Build Coastguard Worker# CHECK: name: compute 36*9880d681SAndroid Build Coastguard Worker# CHECK: liveins: 37*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT: - { reg: '%edi' } 38*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT: frameInfo: 39*9880d681SAndroid Build Coastguard Workername: compute 40*9880d681SAndroid Build Coastguard Workerliveins: 41*9880d681SAndroid Build Coastguard Worker - { reg: '%edi' } 42*9880d681SAndroid Build Coastguard WorkerframeInfo: 43*9880d681SAndroid Build Coastguard Worker stackSize: 8 44*9880d681SAndroid Build Coastguard Workerbody: | 45*9880d681SAndroid Build Coastguard Worker bb.0.body: 46*9880d681SAndroid Build Coastguard Worker liveins: %edi 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker %eax = IMUL32rri8 %edi, 11, implicit-def %eflags 49*9880d681SAndroid Build Coastguard Worker RETQ %eax 50*9880d681SAndroid Build Coastguard Worker... 51*9880d681SAndroid Build Coastguard Worker--- 52*9880d681SAndroid Build Coastguard Workername: foo 53*9880d681SAndroid Build Coastguard Workerliveins: 54*9880d681SAndroid Build Coastguard Worker - { reg: '%edi' } 55*9880d681SAndroid Build Coastguard Worker# CHECK: name: foo 56*9880d681SAndroid Build Coastguard Worker# CHECK: calleeSavedRegisters: [ '%bh', '%bl', '%bp', '%bpl', '%bx', '%ebp', '%ebx', 57*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT: '%rbp', '%rbx', '%r12', '%r13', '%r14', '%r15', 58*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT: '%r12b', '%r13b', '%r14b', '%r15b', '%r12d', '%r13d', 59*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT: '%r14d', '%r15d', '%r12w', '%r13w', '%r14w', '%r15w' ] 60*9880d681SAndroid Build Coastguard WorkercalleeSavedRegisters: [ '%bh', '%bl', '%bp', '%bpl', '%bx', '%ebp', '%ebx', 61*9880d681SAndroid Build Coastguard Worker '%rbp', '%rbx', '%r12', '%r13', '%r14', '%r15', 62*9880d681SAndroid Build Coastguard Worker '%r12b', '%r13b', '%r14b', '%r15b', '%r12d', '%r13d', 63*9880d681SAndroid Build Coastguard Worker '%r14d', '%r15d', '%r12w', '%r13w', '%r14w', '%r15w' ] 64*9880d681SAndroid Build Coastguard Workerbody: | 65*9880d681SAndroid Build Coastguard Worker bb.0.entry: 66*9880d681SAndroid Build Coastguard Worker liveins: %edi 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker PUSH64r %rax, implicit-def %rsp, implicit %rsp 69*9880d681SAndroid Build Coastguard Worker CALL64pcrel32 @compute, csr_64, implicit %rsp, implicit %edi, implicit-def %rsp, implicit-def %eax 70*9880d681SAndroid Build Coastguard Worker %rdx = POP64r implicit-def %rsp, implicit %rsp 71*9880d681SAndroid Build Coastguard Worker RETQ %eax 72*9880d681SAndroid Build Coastguard Worker... 73*9880d681SAndroid Build Coastguard Worker--- 74*9880d681SAndroid Build Coastguard Workername: bar 75*9880d681SAndroid Build Coastguard Workerliveins: 76*9880d681SAndroid Build Coastguard Worker - { reg: '%edi' } 77*9880d681SAndroid Build Coastguard Worker# Verify that the callee saved register can be inferred from register mask 78*9880d681SAndroid Build Coastguard Worker# machine operands: 79*9880d681SAndroid Build Coastguard Worker# CHECK: name: bar 80*9880d681SAndroid Build Coastguard Worker# CHECK: calleeSavedRegisters: [ '%bh', '%bl', '%bp', '%bpl', '%bx', '%ebp', '%ebx', 81*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT: '%rbp', '%rbx', '%r12', '%r13', '%r14', '%r15', 82*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT: '%r12b', '%r13b', '%r14b', '%r15b', '%r12d', '%r13d', 83*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT: '%r14d', '%r15d', '%r12w', '%r13w', '%r14w', '%r15w' ] 84*9880d681SAndroid Build Coastguard Workerbody: | 85*9880d681SAndroid Build Coastguard Worker bb.0.entry: 86*9880d681SAndroid Build Coastguard Worker liveins: %edi 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker PUSH64r %rax, implicit-def %rsp, implicit %rsp 89*9880d681SAndroid Build Coastguard Worker CALL64pcrel32 @compute, csr_64, implicit %rsp, implicit %edi, implicit-def %rsp, implicit-def %eax 90*9880d681SAndroid Build Coastguard Worker %rdx = POP64r implicit-def %rsp, implicit %rsp 91*9880d681SAndroid Build Coastguard Worker RETQ %eax 92*9880d681SAndroid Build Coastguard Worker... 93*9880d681SAndroid Build Coastguard Worker--- 94*9880d681SAndroid Build Coastguard Workername: empty 95*9880d681SAndroid Build Coastguard Workerliveins: 96*9880d681SAndroid Build Coastguard Worker - { reg: '%edi' } 97*9880d681SAndroid Build Coastguard Worker# Verify that the callee saved register can be empty. 98*9880d681SAndroid Build Coastguard Worker# CHECK: name: empty 99*9880d681SAndroid Build Coastguard Worker# CHECK: calleeSavedRegisters: [ ] 100*9880d681SAndroid Build Coastguard WorkercalleeSavedRegisters: [ ] 101*9880d681SAndroid Build Coastguard Workerbody: | 102*9880d681SAndroid Build Coastguard Worker bb.0.entry: 103*9880d681SAndroid Build Coastguard Worker liveins: %edi 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker PUSH64r %rax, implicit-def %rsp, implicit %rsp 106*9880d681SAndroid Build Coastguard Worker CALL64pcrel32 @compute, csr_64, implicit %rsp, implicit %edi, implicit-def %rsp, implicit-def %eax 107*9880d681SAndroid Build Coastguard Worker %rdx = POP64r implicit-def %rsp, implicit %rsp 108*9880d681SAndroid Build Coastguard Worker RETQ %eax 109*9880d681SAndroid Build Coastguard Worker... 110