mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[SelectionDAG] Propagate alias metadata to target intrinsic nodes
When a target intrinsic has been determined to touch memory, we construct a MachineMemOperand during SDAG construction. In this case, we should propagate AAMDNodes metadata to the MachineMemOperand where available. Differential revision: https://reviews.llvm.org/D64131 llvm-svn: 365043
This commit is contained in:
parent
56fa2402b4
commit
8f41221e00
@ -1035,7 +1035,8 @@ public:
|
||||
unsigned Align = 0,
|
||||
MachineMemOperand::Flags Flags
|
||||
= MachineMemOperand::MOLoad | MachineMemOperand::MOStore,
|
||||
unsigned Size = 0);
|
||||
unsigned Size = 0,
|
||||
const AAMDNodes &AAInfo = AAMDNodes());
|
||||
|
||||
SDValue getMemIntrinsicNode(unsigned Opcode, const SDLoc &dl, SDVTList VTList,
|
||||
ArrayRef<SDValue> Ops, EVT MemVT,
|
||||
|
@ -6562,7 +6562,7 @@ SDValue SelectionDAG::getMergeValues(ArrayRef<SDValue> Ops, const SDLoc &dl) {
|
||||
SDValue SelectionDAG::getMemIntrinsicNode(
|
||||
unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef<SDValue> Ops,
|
||||
EVT MemVT, MachinePointerInfo PtrInfo, unsigned Align,
|
||||
MachineMemOperand::Flags Flags, unsigned Size) {
|
||||
MachineMemOperand::Flags Flags, unsigned Size, const AAMDNodes &AAInfo) {
|
||||
if (Align == 0) // Ensure that codegen never sees alignment 0
|
||||
Align = getEVTAlignment(MemVT);
|
||||
|
||||
@ -6571,7 +6571,7 @@ SDValue SelectionDAG::getMemIntrinsicNode(
|
||||
|
||||
MachineFunction &MF = getMachineFunction();
|
||||
MachineMemOperand *MMO =
|
||||
MF.getMachineMemOperand(PtrInfo, Flags, Size, Align);
|
||||
MF.getMachineMemOperand(PtrInfo, Flags, Size, Align, AAInfo);
|
||||
|
||||
return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, MMO);
|
||||
}
|
||||
|
@ -4745,10 +4745,12 @@ void SelectionDAGBuilder::visitTargetIntrinsic(const CallInst &I,
|
||||
SDValue Result;
|
||||
if (IsTgtIntrinsic) {
|
||||
// This is target intrinsic that touches memory
|
||||
Result = DAG.getMemIntrinsicNode(Info.opc, getCurSDLoc(), VTs,
|
||||
Ops, Info.memVT,
|
||||
MachinePointerInfo(Info.ptrVal, Info.offset), Info.align,
|
||||
Info.flags, Info.size);
|
||||
AAMDNodes AAInfo;
|
||||
I.getAAMetadata(AAInfo);
|
||||
Result =
|
||||
DAG.getMemIntrinsicNode(Info.opc, getCurSDLoc(), VTs, Ops, Info.memVT,
|
||||
MachinePointerInfo(Info.ptrVal, Info.offset),
|
||||
Info.align, Info.flags, Info.size, AAInfo);
|
||||
} else if (!HasChain) {
|
||||
Result = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, getCurSDLoc(), VTs, Ops);
|
||||
} else if (!I.getType()->isVoidTy()) {
|
||||
|
@ -1,6 +1,7 @@
|
||||
; RUN: llc -march=amdgcn -mcpu=bonaire -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,CI,CIVI %s
|
||||
; RUN: llc -march=amdgcn -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,VI,CIVI %s
|
||||
; RUN: llc -march=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX9 %s
|
||||
; RUN: llc -march=amdgcn -mcpu=bonaire -verify-machineinstrs -stop-before=machine-scheduler < %s | FileCheck -enable-var-scope -check-prefixes=MIR %s
|
||||
|
||||
declare i32 @llvm.amdgcn.atomic.inc.i32.p1i32(i32 addrspace(1)* nocapture, i32, i32, i32, i1) #2
|
||||
declare i32 @llvm.amdgcn.atomic.inc.i32.p3i32(i32 addrspace(3)* nocapture, i32, i32, i32, i1) #2
|
||||
@ -18,12 +19,16 @@ declare i32 @llvm.amdgcn.workitem.id.x() #1
|
||||
|
||||
; GCN-DAG: v_mov_b32_e32 [[K:v[0-9]+]], 42
|
||||
; GCN: ds_inc_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, [[K]]
|
||||
; MIR-LABEL: @lds_atomic_inc_ret_i32
|
||||
; MIR: DS_INC_RTN_U32 {{.*}} :: (load store 4 on %{{.*}}, !noalias !{{[0-9]+}}, addrspace 3)
|
||||
define amdgpu_kernel void @lds_atomic_inc_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) #0 {
|
||||
%result = call i32 @llvm.amdgcn.atomic.inc.i32.p3i32(i32 addrspace(3)* %ptr, i32 42, i32 0, i32 0, i1 false)
|
||||
%result = call i32 @llvm.amdgcn.atomic.inc.i32.p3i32(i32 addrspace(3)* %ptr, i32 42, i32 0, i32 0, i1 false), !noalias !0
|
||||
store i32 %result, i32 addrspace(1)* %out
|
||||
ret void
|
||||
}
|
||||
|
||||
!0 = distinct !{!0, !"noalias-scope"}
|
||||
|
||||
; GCN-LABEL: {{^}}lds_atomic_inc_ret_i32_offset:
|
||||
; CIVI-DAG: s_mov_b32 m0
|
||||
; GFX9-NOT: m0
|
||||
|
Loading…
x
Reference in New Issue
Block a user