Index: llvm/trunk/lib/Target/AArch64/AArch64LegalizerInfo.cpp =================================================================== --- llvm/trunk/lib/Target/AArch64/AArch64LegalizerInfo.cpp +++ llvm/trunk/lib/Target/AArch64/AArch64LegalizerInfo.cpp @@ -293,6 +293,8 @@ atomicOrderingAtLeastOrStrongerThan(0, AtomicOrdering::Monotonic))); } + getActionDefinitionsBuilder(G_BLOCK_ADDR).legalFor({p0}); + // Merge/Unmerge for (unsigned Op : {G_MERGE_VALUES, G_UNMERGE_VALUES}) { unsigned BigTyIdx = Op == G_MERGE_VALUES ? 0 : 1; Index: llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-blockaddress.mir =================================================================== --- llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-blockaddress.mir +++ llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-blockaddress.mir @@ -0,0 +1,45 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=aarch64-linux-gnu -O0 -run-pass=legalizer %s -o - | FileCheck %s +--- | + 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 +tracksRegLiveness: true +registers: + - { id: 0, class: _ } + - { id: 1, class: _ } +body: | + ; CHECK-LABEL: name: test_blockaddress + ; CHECK: bb.0 (%ir-block.0): + ; CHECK: successors: %bb.1(0x80000000) + ; CHECK: [[BLOCK_ADDR:%[0-9]+]]:_(p0) = G_BLOCK_ADDR blockaddress(@test_blockaddress, %ir-block.block) + ; CHECK: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @addr + ; CHECK: G_STORE [[BLOCK_ADDR]](p0), [[GV]](p0) :: (store 8 into @addr) + ; CHECK: G_BRINDIRECT [[BLOCK_ADDR]](p0) + ; CHECK: bb.1.block (address-taken): + ; CHECK: RET_ReallyLR + bb.1 (%ir-block.0): + %0:_(p0) = G_BLOCK_ADDR blockaddress(@test_blockaddress, %ir-block.block) + %1:_(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 + +... +