| # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py | |
| # RUN: llc -mtriple=aarch64-unknown-unknown -o - -verify-machineinstrs -run-pass=instruction-select %s | FileCheck %s | |
| # RUN: llc -mtriple=aarch64-unknown-unknown -o - -verify-machineinstrs -run-pass=instruction-select -code-model=large %s | FileCheck %s --check-prefix=LARGE | |
| --- | | |
| ; ModuleID = 'blockaddress.ll' | |
| source_filename = "blockaddress.ll" | |
| target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" | |
| target triple = "aarch64-none-linux-gnu" | |
| @addr = global i8* null | |
| define void @test_blockaddress() { | |
| store i8* blockaddress(@test_blockaddress, %block), i8** @addr | |
| indirectbr i8* blockaddress(@test_blockaddress, %block), [label %block] | |
| block: ; preds = %0 | |
| ret void | |
| } | |
| ... | |
| --- | |
| name: test_blockaddress | |
| alignment: 2 | |
| legalized: true | |
| regBankSelected: true | |
| tracksRegLiveness: true | |
| registers: | |
| - { id: 0, class: gpr } | |
| - { id: 1, class: gpr } | |
| body: | | |
| ; CHECK-LABEL: name: test_blockaddress | |
| ; CHECK: bb.0 (%ir-block.0): | |
| ; CHECK: successors: %bb.1(0x80000000) | |
| ; CHECK: [[MOVaddrBA:%[0-9]+]]:gpr64 = MOVaddrBA target-flags(aarch64-page) blockaddress(@test_blockaddress, %ir-block.block), target-flags(aarch64-pageoff, aarch64-nc) blockaddress(@test_blockaddress, %ir-block.block) | |
| ; CHECK: [[MOVaddr:%[0-9]+]]:gpr64common = MOVaddr target-flags(aarch64-page) @addr, target-flags(aarch64-pageoff, aarch64-nc) @addr | |
| ; CHECK: STRXui [[MOVaddrBA]], [[MOVaddr]], 0 :: (store 8 into @addr) | |
| ; CHECK: BR [[MOVaddrBA]] | |
| ; CHECK: bb.1.block (address-taken): | |
| ; CHECK: RET_ReallyLR | |
| ; LARGE-LABEL: name: test_blockaddress | |
| ; LARGE: bb.0 (%ir-block.0): | |
| ; LARGE: successors: %bb.1(0x80000000) | |
| ; LARGE: [[MOVZXi:%[0-9]+]]:gpr64 = MOVZXi target-flags(aarch64-g0, aarch64-nc) blockaddress(@test_blockaddress, %ir-block.block), 0 | |
| ; LARGE: [[MOVKXi:%[0-9]+]]:gpr64 = MOVKXi [[MOVZXi]], target-flags(aarch64-g1, aarch64-nc) blockaddress(@test_blockaddress, %ir-block.block), 16 | |
| ; LARGE: [[MOVKXi1:%[0-9]+]]:gpr64 = MOVKXi [[MOVKXi]], target-flags(aarch64-g2, aarch64-nc) blockaddress(@test_blockaddress, %ir-block.block), 32 | |
| ; LARGE: [[MOVKXi2:%[0-9]+]]:gpr64 = MOVKXi [[MOVKXi1]], target-flags(aarch64-g3) blockaddress(@test_blockaddress, %ir-block.block), 48 | |
| ; LARGE: [[MOVZXi1:%[0-9]+]]:gpr64 = MOVZXi target-flags(aarch64-g0, aarch64-nc) @addr, 0 | |
| ; LARGE: [[MOVKXi3:%[0-9]+]]:gpr64 = MOVKXi [[MOVZXi1]], target-flags(aarch64-g1, aarch64-nc) @addr, 16 | |
| ; LARGE: [[MOVKXi4:%[0-9]+]]:gpr64 = MOVKXi [[MOVKXi3]], target-flags(aarch64-g2, aarch64-nc) @addr, 32 | |
| ; LARGE: [[MOVKXi5:%[0-9]+]]:gpr64common = MOVKXi [[MOVKXi4]], target-flags(aarch64-g3) @addr, 48 | |
| ; LARGE: STRXui [[MOVKXi2]], [[MOVKXi5]], 0 :: (store 8 into @addr) | |
| ; LARGE: BR [[MOVKXi2]] | |
| ; LARGE: bb.1.block (address-taken): | |
| ; LARGE: RET_ReallyLR | |
| bb.1 (%ir-block.0): | |
| %0:gpr(p0) = G_BLOCK_ADDR blockaddress(@test_blockaddress, %ir-block.block) | |
| %1:gpr(p0) = G_GLOBAL_VALUE @addr | |
| G_STORE %0(p0), %1(p0) :: (store 8 into @addr) | |
| G_BRINDIRECT %0(p0) | |
| bb.2.block (address-taken): | |
| RET_ReallyLR | |
| ... |