From 8f43193167c58861ee8c2a89031af0463828e1bf Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Tue, 1 Dec 2015 23:04:00 +0000 Subject: [PATCH] AMDGPU: Implement isNoopAddrSpaceCast git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254468 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/AMDGPU/SIISelLowering.cpp | 11 ++++ lib/Target/AMDGPU/SIISelLowering.h | 2 + .../AMDGPU/cgp-addressing-modes-flat.ll | 66 +++++++++++++++++++ 3 files changed, 79 insertions(+) diff --git a/lib/Target/AMDGPU/SIISelLowering.cpp b/lib/Target/AMDGPU/SIISelLowering.cpp index ab93bceb96e..2cb801a707e 100644 --- a/lib/Target/AMDGPU/SIISelLowering.cpp +++ b/lib/Target/AMDGPU/SIISelLowering.cpp @@ -492,6 +492,17 @@ EVT SITargetLowering::getOptimalMemOpType(uint64_t Size, unsigned DstAlign, return MVT::Other; } +static bool isFlatGlobalAddrSpace(unsigned AS) { + return AS == AMDGPUAS::GLOBAL_ADDRESS || + AS == AMDGPUAS::FLAT_ADDRESS || + AS == AMDGPUAS::CONSTANT_ADDRESS; +} + +bool SITargetLowering::isNoopAddrSpaceCast(unsigned SrcAS, + unsigned DestAS) const { + return isFlatGlobalAddrSpace(SrcAS) && isFlatGlobalAddrSpace(DestAS); +} + TargetLoweringBase::LegalizeTypeAction SITargetLowering::getPreferredVectorAction(EVT VT) const { if (VT.getVectorNumElements() != 1 && VT.getScalarType().bitsLE(MVT::i16)) diff --git a/lib/Target/AMDGPU/SIISelLowering.h b/lib/Target/AMDGPU/SIISelLowering.h index 0659dd7d5d0..b9f75cd11de 100644 --- a/lib/Target/AMDGPU/SIISelLowering.h +++ b/lib/Target/AMDGPU/SIISelLowering.h @@ -80,6 +80,8 @@ public: bool MemcpyStrSrc, MachineFunction &MF) const override; + bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const override; + TargetLoweringBase::LegalizeTypeAction getPreferredVectorAction(EVT VT) const override; diff --git a/test/CodeGen/AMDGPU/cgp-addressing-modes-flat.ll b/test/CodeGen/AMDGPU/cgp-addressing-modes-flat.ll index 4d70ba83781..1c5bed3b905 100644 --- a/test/CodeGen/AMDGPU/cgp-addressing-modes-flat.ll +++ b/test/CodeGen/AMDGPU/cgp-addressing-modes-flat.ll @@ -30,3 +30,69 @@ endif: done: ret void } + +; OPT-LABEL: @test_sink_noop_addrspacecast_flat_to_global_i32( +; OPT: getelementptr i32, i32 addrspace(4)* %out, +; OPT-CI-NOT: getelementptr +; OPT: br i1 + +; OPT-CI: ptrtoint +; OPT-CI: add +; OPT-CI: inttoptr +; OPT: br label + +; GCN-LABEL: {{^}}test_sink_noop_addrspacecast_flat_to_global_i32: +; CI: buffer_load_dword {{v[0-9]+}}, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:28 +define void @test_sink_noop_addrspacecast_flat_to_global_i32(i32 addrspace(4)* %out, i32 addrspace(4)* %in, i32 %cond) { +entry: + %out.gep = getelementptr i32, i32 addrspace(4)* %out, i64 999999 + %in.gep = getelementptr i32, i32 addrspace(4)* %in, i64 7 + %cast = addrspacecast i32 addrspace(4)* %in.gep to i32 addrspace(1)* + %tmp0 = icmp eq i32 %cond, 0 + br i1 %tmp0, label %endif, label %if + +if: + %tmp1 = load i32, i32 addrspace(1)* %cast + br label %endif + +endif: + %x = phi i32 [ %tmp1, %if ], [ 0, %entry ] + store i32 %x, i32 addrspace(4)* %out.gep + br label %done + +done: + ret void +} + +; OPT-LABEL: @test_sink_noop_addrspacecast_flat_to_constant_i32( +; OPT: getelementptr i32, i32 addrspace(4)* %out, +; OPT-CI-NOT: getelementptr +; OPT: br i1 + +; OPT-CI: ptrtoint +; OPT-CI: add +; OPT-CI: inttoptr +; OPT: br label + +; GCN-LABEL: {{^}}test_sink_noop_addrspacecast_flat_to_constant_i32: +; CI: s_load_dword {{s[0-9]+}}, s{{\[[0-9]+:[0-9]+\]}}, 0xd +define void @test_sink_noop_addrspacecast_flat_to_constant_i32(i32 addrspace(4)* %out, i32 addrspace(4)* %in, i32 %cond) { +entry: + %out.gep = getelementptr i32, i32 addrspace(4)* %out, i64 999999 + %in.gep = getelementptr i32, i32 addrspace(4)* %in, i64 7 + %cast = addrspacecast i32 addrspace(4)* %in.gep to i32 addrspace(2)* + %tmp0 = icmp eq i32 %cond, 0 + br i1 %tmp0, label %endif, label %if + +if: + %tmp1 = load i32, i32 addrspace(2)* %cast + br label %endif + +endif: + %x = phi i32 [ %tmp1, %if ], [ 0, %entry ] + store i32 %x, i32 addrspace(4)* %out.gep + br label %done + +done: + ret void +} -- 2.34.1