# RUN: llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o - %s | FileCheck %s # This test ensures that the MIR parser parses the block address operands # correctly. --- | @addr = global i8* null define void @test() { entry: store volatile i8* blockaddress(@test, %block), i8** @addr %val = load volatile i8*, i8** @addr indirectbr i8* %val, [label %block] block: ret void } define void @test2() { entry: store volatile i8* blockaddress(@test2, %"quoted block"), i8** @addr %val = load volatile i8*, i8** @addr indirectbr i8* %val, [label %"quoted block"] "quoted block": ret void } define void @slot_in_other_function(i8** %addr) { entry: store volatile i8* blockaddress(@test3, %0), i8** %addr ret void } define void @test3() { entry: store volatile i8* blockaddress(@test3, %0), i8** @addr %val = load volatile i8*, i8** @addr indirectbr i8* %val, [label %0] ret void } define void @test4() { entry: store volatile i8* blockaddress(@test4, %block), i8** @addr %val = load volatile i8*, i8** @addr indirectbr i8* %val, [label %block] block: ret void } ... --- name: test body: | bb.0.entry: successors: %bb.1.block ; CHECK: %rax = LEA64r %rip, 1, _, blockaddress(@test, %ir-block.block), _ %rax = LEA64r %rip, 1, _, blockaddress(@test, %ir-block.block), _ MOV64mr %rip, 1, _, @addr, _, killed %rax JMP64m %rip, 1, _, @addr, _ bb.1.block (address-taken): RETQ ... --- name: test2 tracksRegLiveness: true body: | bb.0.entry: successors: %bb.1 ; CHECK: %rax = LEA64r %rip, 1, _, blockaddress(@test2, %ir-block."quoted block"), _ %rax = LEA64r %rip, 1, _, blockaddress(@test2, %ir-block."quoted block"), _ MOV64mr %rip, 1, _, @addr, _, killed %rax JMP64m %rip, 1, _, @addr, _ bb.1 (address-taken): RETQ ... --- name: slot_in_other_function tracksRegLiveness: true body: | bb.0.entry: liveins: %rdi ; CHECK-LABEL: name: slot_in_other_function ; CHECK: %rax = LEA64r %rip, 1, _, blockaddress(@test3, %ir-block.0), _ %rax = LEA64r %rip, 1, _, blockaddress(@test3, %ir-block.0), _ MOV64mr killed %rdi, 1, _, 0, _, killed %rax RETQ ... --- name: test3 tracksRegLiveness: true body: | bb.0.entry: successors: %bb.1 ; CHECK-LABEL: name: test3 ; CHECK: %rax = LEA64r %rip, 1, _, blockaddress(@test3, %ir-block.0), _ %rax = LEA64r %rip, 1, _, blockaddress(@test3, %ir-block.0), _ MOV64mr %rip, 1, _, @addr, _, killed %rax JMP64m %rip, 1, _, @addr, _ bb.1 (address-taken): RETQ ... --- name: test4 body: | bb.0.entry: successors: %bb.1.block ; CHECK: %rax = LEA64r %rip, 1, _, blockaddress(@test, %ir-block.block) + 2, _ %rax = LEA64r %rip, 1, _, blockaddress(@test, %ir-block.block) + 2, _ MOV64mr %rip, 1, _, @addr, _, killed %rax JMP64m %rip, 1, _, @addr, _ bb.1.block (address-taken): RETQ ...