forked from OSchip/llvm-project
AMDGPU/R600: Implement allowsMisalignedMemoryAccess
This avoids some test regressions in a future commit when unaligned operations are expanded when they have custom lowering. llvm-svn: 261570
This commit is contained in:
parent
ce38c2ddf6
commit
fa67bdbde0
|
@ -1784,6 +1784,26 @@ EVT R600TargetLowering::getSetCCResultType(const DataLayout &DL, LLVMContext &,
|
|||
return VT.changeVectorElementTypeToInteger();
|
||||
}
|
||||
|
||||
bool R600TargetLowering::allowsMisalignedMemoryAccesses(EVT VT,
|
||||
unsigned AddrSpace,
|
||||
unsigned Align,
|
||||
bool *IsFast) const {
|
||||
if (IsFast)
|
||||
*IsFast = false;
|
||||
|
||||
if (!VT.isSimple() || VT == MVT::Other)
|
||||
return false;
|
||||
|
||||
if (VT.bitsLT(MVT::i32))
|
||||
return false;
|
||||
|
||||
// TODO: This is a rough estimate.
|
||||
if (IsFast)
|
||||
*IsFast = true;
|
||||
|
||||
return VT.bitsGT(MVT::i32) && Align % 4 == 0;
|
||||
}
|
||||
|
||||
static SDValue CompactSwizzlableVector(
|
||||
SelectionDAG &DAG, SDValue VectorEntry,
|
||||
DenseMap<unsigned, unsigned> &RemapSwizzle) {
|
||||
|
|
|
@ -41,6 +41,10 @@ public:
|
|||
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &,
|
||||
EVT VT) const override;
|
||||
|
||||
bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS,
|
||||
unsigned Align,
|
||||
bool *IsFast) const override;
|
||||
|
||||
private:
|
||||
unsigned Gen;
|
||||
/// Each OpenCL kernel has nine implicit parameters that are stored in the
|
||||
|
|
|
@ -358,20 +358,13 @@ entry:
|
|||
ret void
|
||||
}
|
||||
|
||||
attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||
|
||||
; When i128 was a legal type this program generated cannot select errors:
|
||||
|
||||
; FUNC-LABEL: {{^}}"i128-const-store":
|
||||
; FIXME: We should be able to to this with one store instruction
|
||||
; EG: STORE_RAW
|
||||
; EG: STORE_RAW
|
||||
; EG: STORE_RAW
|
||||
; EG: STORE_RAW
|
||||
; CM: STORE_DWORD
|
||||
; CM: STORE_DWORD
|
||||
; CM: STORE_DWORD
|
||||
; CM: STORE_DWORD
|
||||
; EG: MEM_RAT_CACHELESS STORE_RAW T{{[0-9]+}}.XYZW, T{{[0-9]+}}.X, 1
|
||||
|
||||
; CM: MEM_RAT_CACHELESS STORE_DWORD T{{[0-9]+}}, T{{[0-9]+}}.X
|
||||
|
||||
; SI: buffer_store_dwordx4
|
||||
define void @i128-const-store(i32 addrspace(1)* %out) {
|
||||
entry:
|
||||
|
@ -384,3 +377,5 @@ entry:
|
|||
store i32 2, i32 addrspace(1)* %arrayidx6, align 4
|
||||
ret void
|
||||
}
|
||||
|
||||
attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||
|
|
Loading…
Reference in New Issue