From 58ce02a3b60897dcd40c6b33a1d3f23003248bdb Mon Sep 17 00:00:00 2001 From: Amara Emerson Date: Tue, 31 Jul 2018 00:08:56 +0000 Subject: [PATCH] [AArch64][GlobalISel] Make G_BLOCK_ADDR legal. Differential Revision: https://reviews.llvm.org/D49902 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@338336 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/AArch64/AArch64LegalizerInfo.cpp | 2 + .../GlobalISel/legalize-blockaddress.mir | 45 +++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 test/CodeGen/AArch64/GlobalISel/legalize-blockaddress.mir diff --git a/lib/Target/AArch64/AArch64LegalizerInfo.cpp b/lib/Target/AArch64/AArch64LegalizerInfo.cpp index 9b8c0a34efb..327c758a7f8 100644 --- a/lib/Target/AArch64/AArch64LegalizerInfo.cpp +++ b/lib/Target/AArch64/AArch64LegalizerInfo.cpp @@ -293,6 +293,8 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST) { 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; diff --git a/test/CodeGen/AArch64/GlobalISel/legalize-blockaddress.mir b/test/CodeGen/AArch64/GlobalISel/legalize-blockaddress.mir new file mode 100644 index 00000000000..60b47db98ed --- /dev/null +++ b/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 + +... + -- 2.50.1