1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -mtriple=aarch64-unknown-unknown -o - -verify-machineinstrs -run-pass=instruction-select %s | FileCheck %s 3# RUN: llc -mtriple=aarch64-unknown-unknown -o - -verify-machineinstrs -run-pass=instruction-select -code-model=large %s | FileCheck %s --check-prefix=LARGE 4# RUN: llc -mtriple=aarch64-unknown-unknown -o - -verify-machineinstrs -run-pass=instruction-select -code-model=large -relocation-model=pic %s | FileCheck %s --check-prefix=LARGE-PIC 5--- | 6 source_filename = "blockaddress.ll" 7 target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" 8 target triple = "aarch64-none-linux-gnu" 9 10 @addr = dso_local global ptr null 11 12 define dso_local void @test_blockaddress() { 13 store ptr blockaddress(@test_blockaddress, %block), ptr @addr 14 indirectbr ptr blockaddress(@test_blockaddress, %block), [label %block] 15 16 block: ; preds = %0 17 ret void 18 } 19 20... 21--- 22name: test_blockaddress 23alignment: 4 24legalized: true 25regBankSelected: true 26tracksRegLiveness: true 27registers: 28 - { id: 0, class: gpr } 29 - { id: 1, class: gpr } 30body: | 31 ; CHECK-LABEL: name: test_blockaddress 32 ; CHECK: bb.0 (%ir-block.0): 33 ; CHECK-NEXT: [[MOVaddrBA:%[0-9]+]]:gpr64common = MOVaddrBA target-flags(aarch64-page) blockaddress(@test_blockaddress, %ir-block.block), target-flags(aarch64-pageoff, aarch64-nc) blockaddress(@test_blockaddress, %ir-block.block) 34 ; CHECK-NEXT: [[MOVaddr:%[0-9]+]]:gpr64common = MOVaddr target-flags(aarch64-page) @addr, target-flags(aarch64-pageoff, aarch64-nc) @addr 35 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64 = COPY [[MOVaddrBA]] 36 ; CHECK-NEXT: STRXui [[COPY]], [[MOVaddr]], 0 :: (store (p0) into @addr) 37 ; CHECK-NEXT: BR [[MOVaddrBA]] 38 ; CHECK-NEXT: {{ $}} 39 ; CHECK-NEXT: bb.1.block (ir-block-address-taken %ir-block.block): 40 ; 41 ; LARGE-LABEL: name: test_blockaddress 42 ; LARGE: bb.0 (%ir-block.0): 43 ; LARGE-NEXT: [[MOVZXi:%[0-9]+]]:gpr64 = MOVZXi target-flags(aarch64-g0, aarch64-nc) blockaddress(@test_blockaddress, %ir-block.block), 0 44 ; LARGE-NEXT: [[MOVKXi:%[0-9]+]]:gpr64 = MOVKXi [[MOVZXi]], target-flags(aarch64-g1, aarch64-nc) blockaddress(@test_blockaddress, %ir-block.block), 16 45 ; LARGE-NEXT: [[MOVKXi1:%[0-9]+]]:gpr64 = MOVKXi [[MOVKXi]], target-flags(aarch64-g2, aarch64-nc) blockaddress(@test_blockaddress, %ir-block.block), 32 46 ; LARGE-NEXT: [[MOVKXi2:%[0-9]+]]:gpr64 = MOVKXi [[MOVKXi1]], target-flags(aarch64-g3) blockaddress(@test_blockaddress, %ir-block.block), 48 47 ; LARGE-NEXT: [[MOVZXi1:%[0-9]+]]:gpr64 = MOVZXi target-flags(aarch64-g0, aarch64-nc) @addr, 0 48 ; LARGE-NEXT: [[MOVKXi3:%[0-9]+]]:gpr64 = MOVKXi [[MOVZXi1]], target-flags(aarch64-g1, aarch64-nc) @addr, 16 49 ; LARGE-NEXT: [[MOVKXi4:%[0-9]+]]:gpr64 = MOVKXi [[MOVKXi3]], target-flags(aarch64-g2, aarch64-nc) @addr, 32 50 ; LARGE-NEXT: [[MOVKXi5:%[0-9]+]]:gpr64common = MOVKXi [[MOVKXi4]], target-flags(aarch64-g3) @addr, 48 51 ; LARGE-NEXT: STRXui [[MOVKXi2]], [[MOVKXi5]], 0 :: (store (p0) into @addr) 52 ; LARGE-NEXT: BR [[MOVKXi2]] 53 ; LARGE-NEXT: {{ $}} 54 ; LARGE-NEXT: bb.1.block (ir-block-address-taken %ir-block.block): 55 ; 56 ; LARGE-PIC-LABEL: name: test_blockaddress 57 ; LARGE-PIC: bb.0 (%ir-block.0): 58 ; LARGE-PIC-NEXT: [[MOVaddrBA:%[0-9]+]]:gpr64common = MOVaddrBA target-flags(aarch64-page) blockaddress(@test_blockaddress, %ir-block.block), target-flags(aarch64-pageoff, aarch64-nc) blockaddress(@test_blockaddress, %ir-block.block) 59 ; LARGE-PIC-NEXT: [[MOVaddr:%[0-9]+]]:gpr64common = MOVaddr target-flags(aarch64-page) @addr, target-flags(aarch64-pageoff, aarch64-nc) @addr 60 ; LARGE-PIC-NEXT: [[COPY:%[0-9]+]]:gpr64 = COPY [[MOVaddrBA]] 61 ; LARGE-PIC-NEXT: STRXui [[COPY]], [[MOVaddr]], 0 :: (store (p0) into @addr) 62 ; LARGE-PIC-NEXT: BR [[MOVaddrBA]] 63 ; LARGE-PIC-NEXT: {{ $}} 64 ; LARGE-PIC-NEXT: bb.1.block (ir-block-address-taken %ir-block.block): 65 bb.1 (%ir-block.0): 66 %0:gpr(p0) = G_BLOCK_ADDR blockaddress(@test_blockaddress, %ir-block.block) 67 %1:gpr(p0) = G_GLOBAL_VALUE @addr 68 G_STORE %0(p0), %1(p0) :: (store (p0) into @addr) 69 G_BRINDIRECT %0(p0) 70 71 bb.2.block (ir-block-address-taken %ir-block.block): 72 RET_ReallyLR 73 74... 75