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