63 lines
3.1 KiB
Plaintext
63 lines
3.1 KiB
Plaintext
|
# 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 = dso_local global i8* null
|
||
|
|
||
|
define dso_local 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: 4
|
||
|
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: [[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: [[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
|
||
|
|
||
|
...
|