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 block address operands 3# correctly. 4 5--- | 6 7 @addr = global i8* null 8 9 define void @test() { 10 entry: 11 store volatile i8* blockaddress(@test, %block), i8** @addr 12 %val = load volatile i8*, i8** @addr 13 indirectbr i8* %val, [label %block] 14 15 block: 16 ret void 17 } 18 19 define void @test2() { 20 entry: 21 store volatile i8* blockaddress(@test2, %"quoted block"), i8** @addr 22 %val = load volatile i8*, i8** @addr 23 indirectbr i8* %val, [label %"quoted block"] 24 25 "quoted block": 26 ret void 27 } 28 29 define void @slot_in_other_function(i8** %addr) { 30 entry: 31 store volatile i8* blockaddress(@test3, %0), i8** %addr 32 ret void 33 } 34 35 define void @test3() { 36 entry: 37 store volatile i8* blockaddress(@test3, %0), i8** @addr 38 %val = load volatile i8*, i8** @addr 39 indirectbr i8* %val, [label %0] 40 41 ret void 42 } 43 44 define void @test4() { 45 entry: 46 store volatile i8* blockaddress(@test4, %block), i8** @addr 47 %val = load volatile i8*, i8** @addr 48 indirectbr i8* %val, [label %block] 49 50 block: 51 ret void 52 } 53 54... 55--- 56name: test 57body: | 58 bb.0.entry: 59 successors: %bb.1.block 60 ; CHECK: %rax = LEA64r %rip, 1, _, blockaddress(@test, %ir-block.block), _ 61 %rax = LEA64r %rip, 1, _, blockaddress(@test, %ir-block.block), _ 62 MOV64mr %rip, 1, _, @addr, _, killed %rax 63 JMP64m %rip, 1, _, @addr, _ 64 65 bb.1.block (address-taken): 66 RETQ 67... 68--- 69name: test2 70tracksRegLiveness: true 71body: | 72 bb.0.entry: 73 successors: %bb.1 74 ; CHECK: %rax = LEA64r %rip, 1, _, blockaddress(@test2, %ir-block."quoted block"), _ 75 %rax = LEA64r %rip, 1, _, blockaddress(@test2, %ir-block."quoted block"), _ 76 MOV64mr %rip, 1, _, @addr, _, killed %rax 77 JMP64m %rip, 1, _, @addr, _ 78 79 bb.1 (address-taken): 80 RETQ 81... 82--- 83name: slot_in_other_function 84tracksRegLiveness: true 85body: | 86 bb.0.entry: 87 liveins: %rdi 88 ; CHECK-LABEL: name: slot_in_other_function 89 ; CHECK: %rax = LEA64r %rip, 1, _, blockaddress(@test3, %ir-block.0), _ 90 %rax = LEA64r %rip, 1, _, blockaddress(@test3, %ir-block.0), _ 91 MOV64mr killed %rdi, 1, _, 0, _, killed %rax 92 RETQ 93... 94--- 95name: test3 96tracksRegLiveness: true 97body: | 98 bb.0.entry: 99 successors: %bb.1 100 ; CHECK-LABEL: name: test3 101 ; CHECK: %rax = LEA64r %rip, 1, _, blockaddress(@test3, %ir-block.0), _ 102 %rax = LEA64r %rip, 1, _, blockaddress(@test3, %ir-block.0), _ 103 MOV64mr %rip, 1, _, @addr, _, killed %rax 104 JMP64m %rip, 1, _, @addr, _ 105 106 bb.1 (address-taken): 107 RETQ 108... 109--- 110name: test4 111body: | 112 bb.0.entry: 113 successors: %bb.1.block 114 ; CHECK: %rax = LEA64r %rip, 1, _, blockaddress(@test, %ir-block.block) + 2, _ 115 %rax = LEA64r %rip, 1, _, blockaddress(@test, %ir-block.block) + 2, _ 116 MOV64mr %rip, 1, _, @addr, _, killed %rax 117 JMP64m %rip, 1, _, @addr, _ 118 119 bb.1.block (address-taken): 120 RETQ 121... 122