forked from OSchip/llvm-project
R600/SI: Custom lower i1 stores
These are sometimes created by the shrink to boolean optimization in the globalopt pass. Reviewed-by: Michel Dänzer <michel.daenzer@amd.com> llvm-svn: 203280
This commit is contained in:
parent
b89843299a
commit
1c8788ef5a
|
@ -98,6 +98,7 @@ SITargetLowering::SITargetLowering(TargetMachine &TM) :
|
|||
setOperationAction(ISD::LOAD, MVT::v4i32, Custom);
|
||||
setOperationAction(ISD::LOAD, MVT::v8i32, Custom);
|
||||
|
||||
setOperationAction(ISD::STORE, MVT::i1, Custom);
|
||||
setOperationAction(ISD::STORE, MVT::i32, Custom);
|
||||
setOperationAction(ISD::STORE, MVT::i64, Custom);
|
||||
setOperationAction(ISD::STORE, MVT::i128, Custom);
|
||||
|
@ -844,6 +845,11 @@ SDValue SITargetLowering::LowerSTORE(SDValue Op, SelectionDAG &DAG) const {
|
|||
if (VT.isVector() && VT.getVectorNumElements() >= 8)
|
||||
return SplitVectorStore(Op, DAG);
|
||||
|
||||
if (VT == MVT::i1)
|
||||
return DAG.getTruncStore(Store->getChain(), DL,
|
||||
DAG.getSExtOrTrunc(Store->getValue(), DL, MVT::i32),
|
||||
Store->getBasePtr(), MVT::i1, Store->getMemOperand());
|
||||
|
||||
if (Store->getAddressSpace() != AMDGPUAS::PRIVATE_ADDRESS)
|
||||
return SDValue();
|
||||
|
||||
|
|
|
@ -1,10 +1,18 @@
|
|||
; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck --check-prefix=EG-CHECK %s
|
||||
; RUN: llc < %s -march=r600 -mcpu=cayman | FileCheck --check-prefix=CM-CHECK %s
|
||||
; RUN: llc < %s -march=r600 -mcpu=verde -verify-machineinstrs | FileCheck --check-prefix=SI-CHECK %s
|
||||
; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck --check-prefix=EG-CHECK --check-prefix=FUNC %s
|
||||
; RUN: llc < %s -march=r600 -mcpu=cayman | FileCheck --check-prefix=CM-CHECK --check-prefix=FUNC %s
|
||||
; RUN: llc < %s -march=r600 -mcpu=verde -verify-machineinstrs | FileCheck --check-prefix=SI-CHECK --check-prefix=FUNC %s
|
||||
|
||||
;===------------------------------------------------------------------------===;
|
||||
; Global Address Space
|
||||
;===------------------------------------------------------------------------===;
|
||||
; FUNC-LABEL: @store_i1
|
||||
; EG-CHECK: MEM_RAT MSKOR
|
||||
; SI-CHECK: BUFFER_STORE_BYTE
|
||||
define void @store_i1(i1 addrspace(1)* %out) {
|
||||
entry:
|
||||
store i1 true, i1 addrspace(1)* %out
|
||||
ret void
|
||||
}
|
||||
|
||||
; i8 store
|
||||
; EG-CHECK-LABEL: @store_i8
|
||||
|
@ -173,6 +181,15 @@ entry:
|
|||
; Local Address Space
|
||||
;===------------------------------------------------------------------------===;
|
||||
|
||||
; FUNC-LABEL: @store_local_i1
|
||||
; EG-CHECK: LDS_BYTE_WRITE
|
||||
; SI-CHECK: DS_WRITE_B8
|
||||
define void @store_local_i1(i1 addrspace(3)* %out) {
|
||||
entry:
|
||||
store i1 true, i1 addrspace(3)* %out
|
||||
ret void
|
||||
}
|
||||
|
||||
; EG-CHECK-LABEL: @store_local_i8
|
||||
; EG-CHECK: LDS_BYTE_WRITE
|
||||
; SI-CHECK-LABEL: @store_local_i8
|
||||
|
|
Loading…
Reference in New Issue