mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-23 20:34:58 +00:00
AMDGPU/SI: Make sure to emit TargetConstant nodes when matching ds_*permute
Summary: This fixes a bug with ds_*permute instructions where if it was passed a constant address, then the offset operand would get assigned a register operand instead of an immediate. Reviewers: scchan, arsenm Subscribers: arsenm, llvm-commits Differential Revision: http://reviews.llvm.org/D19994 llvm-svn: 272349
This commit is contained in:
parent
5e3b2f93ed
commit
7240ff2203
@ -876,7 +876,7 @@ bool AMDGPUDAGToDAGISel::SelectDS1Addr1Offset(SDValue Addr, SDValue &Base,
|
||||
Zero, Addr.getOperand(1));
|
||||
|
||||
Base = SDValue(MachineSub, 0);
|
||||
Offset = Addr.getOperand(0);
|
||||
Offset = CurDAG->getTargetConstant(ByteOffset, DL, MVT::i16);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -894,7 +894,7 @@ bool AMDGPUDAGToDAGISel::SelectDS1Addr1Offset(SDValue Addr, SDValue &Base,
|
||||
MachineSDNode *MovZero = CurDAG->getMachineNode(AMDGPU::V_MOV_B32_e32,
|
||||
DL, MVT::i32, Zero);
|
||||
Base = SDValue(MovZero, 0);
|
||||
Offset = Addr;
|
||||
Offset = CurDAG->getTargetConstant(CAddr->getZExtValue(), DL, MVT::i16);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -21,4 +21,13 @@ define void @ds_bpermute_imm_offset(i32 addrspace(1)* %out, i32 %base_index, i32
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-LABEL: {{^}}ds_bpermute_imm_index:
|
||||
; CHECK: ds_bpermute_b32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:64
|
||||
; CHECK: s_waitcnt lgkmcnt
|
||||
define void @ds_bpermute_imm_index(i32 addrspace(1)* %out, i32 %base_index, i32 %src) nounwind {
|
||||
%bpermute = call i32 @llvm.amdgcn.ds.bpermute(i32 64, i32 %src) #0
|
||||
store i32 %bpermute, i32 addrspace(1)* %out, align 4
|
||||
ret void
|
||||
}
|
||||
|
||||
attributes #0 = { nounwind readnone convergent }
|
||||
|
Loading…
x
Reference in New Issue
Block a user