mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-29 00:21:14 +00:00
CodeGen: Fix pointer info in SplitVecOp_EXTRACT_VECTOR_ELT/SplitVecRes_INSERT_VECTOR_ELT
Two issues found when doing codegen for splitting vector with non-zero alloca addr space: DAGTypeLegalizer::SplitVecRes_INSERT_VECTOR_ELT/SplitVecOp_EXTRACT_VECTOR_ELT uses dummy pointer info for creating SDStore. Since one pointer operand contains multiply and add, InferPointerInfo is unable to infer the correct pointer info, which ends up with a dummy pointer info for the target to lower store and results in isel failure. The fix is to introduce MachinePointerInfo::getUnknownStack to represent MachinePointerInfo which is known in alloca address space but without other information. TargetLowering::getVectorElementPointer uses value type of pointer in addr space 0 for multiplication of index and then add it to the pointer. However the pointer may be in an addr space which has different size than addr space 0. The fix is to use the pointer value type for index multiplication. Differential Revision: https://reviews.llvm.org/D39758 llvm-svn: 319622
This commit is contained in:
parent
c256a4ed17
commit
494770403a
@ -47,17 +47,27 @@ struct MachinePointerInfo {
|
||||
|
||||
uint8_t StackID;
|
||||
|
||||
explicit MachinePointerInfo(const Value *v = nullptr, int64_t offset = 0,
|
||||
uint8_t ID = 0)
|
||||
: V(v), Offset(offset), StackID(ID) {}
|
||||
unsigned AddrSpace;
|
||||
|
||||
explicit MachinePointerInfo(const PseudoSourceValue *v,
|
||||
int64_t offset = 0,
|
||||
explicit MachinePointerInfo(const Value *v, int64_t offset = 0,
|
||||
uint8_t ID = 0)
|
||||
: V(v), Offset(offset), StackID(ID) {}
|
||||
: V(v), Offset(offset), StackID(ID) {
|
||||
AddrSpace = v ? v->getType()->getPointerAddressSpace() : 0;
|
||||
}
|
||||
|
||||
explicit MachinePointerInfo(const PseudoSourceValue *v, int64_t offset = 0,
|
||||
uint8_t ID = 0)
|
||||
: V(v), Offset(offset), StackID(ID) {
|
||||
AddrSpace = v ? v->getAddressSpace() : 0;
|
||||
}
|
||||
|
||||
explicit MachinePointerInfo(unsigned AddressSpace = 0)
|
||||
: V((const Value *)nullptr), Offset(0), StackID(0),
|
||||
AddrSpace(AddressSpace) {}
|
||||
|
||||
MachinePointerInfo getWithOffset(int64_t O) const {
|
||||
if (V.isNull()) return MachinePointerInfo();
|
||||
if (V.isNull())
|
||||
return MachinePointerInfo(AddrSpace);
|
||||
if (V.is<const Value*>())
|
||||
return MachinePointerInfo(V.get<const Value*>(), Offset+O, StackID);
|
||||
return MachinePointerInfo(V.get<const PseudoSourceValue*>(), Offset+O,
|
||||
@ -89,6 +99,9 @@ struct MachinePointerInfo {
|
||||
/// Stack pointer relative access.
|
||||
static MachinePointerInfo getStack(MachineFunction &MF, int64_t Offset,
|
||||
uint8_t ID = 0);
|
||||
|
||||
/// Stack memory without other information.
|
||||
static MachinePointerInfo getUnknownStack(MachineFunction &MF);
|
||||
};
|
||||
|
||||
|
||||
|
@ -534,16 +534,7 @@ LLVM_DUMP_METHOD void MachineOperand::dump() const { dbgs() << *this << '\n'; }
|
||||
|
||||
/// getAddrSpace - Return the LLVM IR address space number that this pointer
|
||||
/// points into.
|
||||
unsigned MachinePointerInfo::getAddrSpace() const {
|
||||
if (V.isNull())
|
||||
return 0;
|
||||
|
||||
if (V.is<const PseudoSourceValue *>())
|
||||
return V.get<const PseudoSourceValue *>()->getAddressSpace();
|
||||
|
||||
return cast<PointerType>(V.get<const Value *>()->getType())
|
||||
->getAddressSpace();
|
||||
}
|
||||
unsigned MachinePointerInfo::getAddrSpace() const { return AddrSpace; }
|
||||
|
||||
/// isDereferenceable - Return true if V is always dereferenceable for
|
||||
/// Offset + Size byte.
|
||||
@ -586,6 +577,10 @@ MachinePointerInfo MachinePointerInfo::getStack(MachineFunction &MF,
|
||||
return MachinePointerInfo(MF.getPSVManager().getStack(), Offset, ID);
|
||||
}
|
||||
|
||||
MachinePointerInfo MachinePointerInfo::getUnknownStack(MachineFunction &MF) {
|
||||
return MachinePointerInfo(MF.getDataLayout().getAllocaAddrSpace());
|
||||
}
|
||||
|
||||
MachineMemOperand::MachineMemOperand(MachinePointerInfo ptrinfo, Flags f,
|
||||
uint64_t s, unsigned int a,
|
||||
const AAMDNodes &AAInfo,
|
||||
|
@ -1058,20 +1058,21 @@ void DAGTypeLegalizer::SplitVecRes_INSERT_VECTOR_ELT(SDNode *N, SDValue &Lo,
|
||||
EVT VecVT = Vec.getValueType();
|
||||
EVT EltVT = VecVT.getVectorElementType();
|
||||
SDValue StackPtr = DAG.CreateStackTemporary(VecVT);
|
||||
SDValue Store =
|
||||
DAG.getStore(DAG.getEntryNode(), dl, Vec, StackPtr, MachinePointerInfo());
|
||||
auto &MF = DAG.getMachineFunction();
|
||||
auto FrameIndex = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
|
||||
auto PtrInfo = MachinePointerInfo::getFixedStack(MF, FrameIndex);
|
||||
SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, Vec, StackPtr, PtrInfo);
|
||||
|
||||
// Store the new element. This may be larger than the vector element type,
|
||||
// so use a truncating store.
|
||||
SDValue EltPtr = TLI.getVectorElementPointer(DAG, StackPtr, VecVT, Idx);
|
||||
Type *VecType = VecVT.getTypeForEVT(*DAG.getContext());
|
||||
unsigned Alignment = DAG.getDataLayout().getPrefTypeAlignment(VecType);
|
||||
Store =
|
||||
DAG.getTruncStore(Store, dl, Elt, EltPtr, MachinePointerInfo(), EltVT);
|
||||
Store = DAG.getTruncStore(Store, dl, Elt, EltPtr,
|
||||
MachinePointerInfo::getUnknownStack(MF), EltVT);
|
||||
|
||||
// Load the Lo part from the stack slot.
|
||||
Lo =
|
||||
DAG.getLoad(Lo.getValueType(), dl, Store, StackPtr, MachinePointerInfo());
|
||||
Lo = DAG.getLoad(Lo.getValueType(), dl, Store, StackPtr, PtrInfo);
|
||||
|
||||
// Increment the pointer to the other part.
|
||||
unsigned IncrementSize = Lo.getValueSizeInBits() / 8;
|
||||
@ -1080,7 +1081,8 @@ void DAGTypeLegalizer::SplitVecRes_INSERT_VECTOR_ELT(SDNode *N, SDValue &Lo,
|
||||
StackPtr.getValueType()));
|
||||
|
||||
// Load the Hi part from the stack slot.
|
||||
Hi = DAG.getLoad(Hi.getValueType(), dl, Store, StackPtr, MachinePointerInfo(),
|
||||
Hi = DAG.getLoad(Hi.getValueType(), dl, Store, StackPtr,
|
||||
PtrInfo.getWithOffset(IncrementSize),
|
||||
MinAlign(Alignment, IncrementSize));
|
||||
}
|
||||
|
||||
@ -1764,13 +1766,16 @@ SDValue DAGTypeLegalizer::SplitVecOp_EXTRACT_VECTOR_ELT(SDNode *N) {
|
||||
|
||||
// Store the vector to the stack.
|
||||
SDValue StackPtr = DAG.CreateStackTemporary(VecVT);
|
||||
SDValue Store =
|
||||
DAG.getStore(DAG.getEntryNode(), dl, Vec, StackPtr, MachinePointerInfo());
|
||||
auto &MF = DAG.getMachineFunction();
|
||||
auto FrameIndex = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
|
||||
auto PtrInfo = MachinePointerInfo::getFixedStack(MF, FrameIndex);
|
||||
SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, Vec, StackPtr, PtrInfo);
|
||||
|
||||
// Load back the required element.
|
||||
StackPtr = TLI.getVectorElementPointer(DAG, StackPtr, VecVT, Idx);
|
||||
return DAG.getExtLoad(ISD::EXTLOAD, dl, N->getValueType(0), Store, StackPtr,
|
||||
MachinePointerInfo(), EltVT);
|
||||
return DAG.getExtLoad(
|
||||
ISD::EXTLOAD, dl, N->getValueType(0), Store, StackPtr,
|
||||
MachinePointerInfo::getUnknownStack(DAG.getMachineFunction()), EltVT);
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::SplitVecOp_ExtVecInRegOp(SDNode *N) {
|
||||
|
@ -5821,7 +5821,8 @@ SDValue SelectionDAG::getMemIntrinsicNode(unsigned Opcode, const SDLoc &dl,
|
||||
/// MachinePointerInfo record from it. This is particularly useful because the
|
||||
/// code generator has many cases where it doesn't bother passing in a
|
||||
/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
|
||||
static MachinePointerInfo InferPointerInfo(SelectionDAG &DAG, SDValue Ptr,
|
||||
static MachinePointerInfo InferPointerInfo(const MachinePointerInfo &Info,
|
||||
SelectionDAG &DAG, SDValue Ptr,
|
||||
int64_t Offset = 0) {
|
||||
// If this is FI+Offset, we can model it.
|
||||
if (const FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr))
|
||||
@ -5832,7 +5833,7 @@ static MachinePointerInfo InferPointerInfo(SelectionDAG &DAG, SDValue Ptr,
|
||||
if (Ptr.getOpcode() != ISD::ADD ||
|
||||
!isa<ConstantSDNode>(Ptr.getOperand(1)) ||
|
||||
!isa<FrameIndexSDNode>(Ptr.getOperand(0)))
|
||||
return MachinePointerInfo();
|
||||
return Info;
|
||||
|
||||
int FI = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
|
||||
return MachinePointerInfo::getFixedStack(
|
||||
@ -5844,14 +5845,15 @@ static MachinePointerInfo InferPointerInfo(SelectionDAG &DAG, SDValue Ptr,
|
||||
/// MachinePointerInfo record from it. This is particularly useful because the
|
||||
/// code generator has many cases where it doesn't bother passing in a
|
||||
/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
|
||||
static MachinePointerInfo InferPointerInfo(SelectionDAG &DAG, SDValue Ptr,
|
||||
static MachinePointerInfo InferPointerInfo(const MachinePointerInfo &Info,
|
||||
SelectionDAG &DAG, SDValue Ptr,
|
||||
SDValue OffsetOp) {
|
||||
// If the 'Offset' value isn't a constant, we can't handle this.
|
||||
if (ConstantSDNode *OffsetNode = dyn_cast<ConstantSDNode>(OffsetOp))
|
||||
return InferPointerInfo(DAG, Ptr, OffsetNode->getSExtValue());
|
||||
return InferPointerInfo(Info, DAG, Ptr, OffsetNode->getSExtValue());
|
||||
if (OffsetOp.isUndef())
|
||||
return InferPointerInfo(DAG, Ptr);
|
||||
return MachinePointerInfo();
|
||||
return InferPointerInfo(Info, DAG, Ptr);
|
||||
return Info;
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
|
||||
@ -5871,7 +5873,7 @@ SDValue SelectionDAG::getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType,
|
||||
// If we don't have a PtrInfo, infer the trivial frame index case to simplify
|
||||
// clients.
|
||||
if (PtrInfo.V.isNull())
|
||||
PtrInfo = InferPointerInfo(*this, Ptr, Offset);
|
||||
PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
|
||||
|
||||
MachineFunction &MF = getMachineFunction();
|
||||
MachineMemOperand *MMO = MF.getMachineMemOperand(
|
||||
@ -5990,7 +5992,7 @@ SDValue SelectionDAG::getStore(SDValue Chain, const SDLoc &dl, SDValue Val,
|
||||
assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
|
||||
|
||||
if (PtrInfo.V.isNull())
|
||||
PtrInfo = InferPointerInfo(*this, Ptr);
|
||||
PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
|
||||
|
||||
MachineFunction &MF = getMachineFunction();
|
||||
MachineMemOperand *MMO = MF.getMachineMemOperand(
|
||||
@ -6040,7 +6042,7 @@ SDValue SelectionDAG::getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val,
|
||||
assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
|
||||
|
||||
if (PtrInfo.V.isNull())
|
||||
PtrInfo = InferPointerInfo(*this, Ptr);
|
||||
PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
|
||||
|
||||
MachineFunction &MF = getMachineFunction();
|
||||
MachineMemOperand *MMO = MF.getMachineMemOperand(
|
||||
|
@ -3797,7 +3797,7 @@ SDValue TargetLowering::getVectorElementPointer(SelectionDAG &DAG,
|
||||
SDValue Index) const {
|
||||
SDLoc dl(Index);
|
||||
// Make sure the index type is big enough to compute in.
|
||||
Index = DAG.getZExtOrTrunc(Index, dl, getPointerTy(DAG.getDataLayout()));
|
||||
Index = DAG.getZExtOrTrunc(Index, dl, VecPtr.getValueType());
|
||||
|
||||
EVT EltVT = VecVT.getVectorElementType();
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
; RUN: llc -debug-only=machine-scheduler -march=amdgcn -verify-machineinstrs %s -o - 2>&1| FileCheck -check-prefix=SI-NOHSA -check-prefix=FUNC -check-prefix=DEBUG %s
|
||||
; RUN: llc -debug-only=machine-scheduler -march=amdgcn -mtriple=amdgcn---amdgiz -verify-machineinstrs %s -o - 2>&1| FileCheck -check-prefix=SI-NOHSA -check-prefix=FUNC -check-prefix=DEBUG %s
|
||||
target datalayout = "A5"
|
||||
; REQUIRES: asserts
|
||||
|
||||
; Verify that the extload generated from %eval has the default
|
||||
@ -6,18 +7,18 @@
|
||||
; size and not 4 corresponding to the sign-extended size (i32).
|
||||
|
||||
; DEBUG: {{^}}# Machine code for function extload_align:
|
||||
; DEBUG: mem:LD2[<unknown>]{{[^(]}}
|
||||
; DEBUG: mem:LD2[<unknown>(addrspace=5)]{{[^(]}}
|
||||
; DEBUG: {{^}}# End machine code for function extload_align.
|
||||
|
||||
define amdgpu_kernel void @extload_align(i32* %out, i32 %index) #0 {
|
||||
%v0 = alloca [4 x i16]
|
||||
%a1 = getelementptr inbounds [4 x i16], [4 x i16]* %v0, i32 0, i32 0
|
||||
%a2 = getelementptr inbounds [4 x i16], [4 x i16]* %v0, i32 0, i32 1
|
||||
store i16 0, i16* %a1
|
||||
store i16 1, i16* %a2
|
||||
%a = getelementptr inbounds [4 x i16], [4 x i16]* %v0, i32 0, i32 %index
|
||||
%val = load i16, i16* %a
|
||||
define amdgpu_kernel void @extload_align(i32 addrspace(5)* %out, i32 %index) #0 {
|
||||
%v0 = alloca [4 x i16], addrspace(5)
|
||||
%a1 = getelementptr inbounds [4 x i16], [4 x i16] addrspace(5)* %v0, i32 0, i32 0
|
||||
%a2 = getelementptr inbounds [4 x i16], [4 x i16] addrspace(5)* %v0, i32 0, i32 1
|
||||
store i16 0, i16 addrspace(5)* %a1
|
||||
store i16 1, i16 addrspace(5)* %a2
|
||||
%a = getelementptr inbounds [4 x i16], [4 x i16] addrspace(5)* %v0, i32 0, i32 %index
|
||||
%val = load i16, i16 addrspace(5)* %a
|
||||
%eval = sext i16 %val to i32
|
||||
store i32 %eval, i32* %out
|
||||
store i32 %eval, i32 addrspace(5)* %out
|
||||
ret void
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI %s
|
||||
; RUN: llc -march=amdgcn -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI %s
|
||||
|
||||
; GCN-LABEL: {{^}}extract_vector_elt_v2f16:
|
||||
; GCN: s_load_dword [[VEC:s[0-9]+]]
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
|
||||
; RUN: llc -march=amdgcn -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
|
||||
|
||||
; GCN-LABEL: {{^}}extract_vector_elt_v3f64_2:
|
||||
; GCN: buffer_load_dwordx4
|
||||
|
@ -1,6 +1,6 @@
|
||||
; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI -check-prefix=SICIVI %s
|
||||
; RUN: llc -march=amdgcn -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI -check-prefix=SICIVI %s
|
||||
; RUN: llc -march=amdgcn -mcpu=gfx901 -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=GFX9 %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI -check-prefix=SICIVI %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI -check-prefix=SICIVI %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -mcpu=gfx901 -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=GFX9 %s
|
||||
|
||||
; GCN-LABEL: {{^}}extract_vector_elt_v2i16:
|
||||
; GCN: s_load_dword [[VEC:s[0-9]+]]
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
|
||||
; RUN: llc -march=amdgcn -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
|
||||
|
||||
; How the replacement of i64 stores with v2i32 stores resulted in
|
||||
; breaking other users of the bitcast if they already existed
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
|
||||
; RUN: llc -march=amdgcn -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
|
||||
|
||||
; FUNC-LABEL: {{^}}extract_vector_elt_v1i8:
|
||||
; GCN: buffer_load_ubyte
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: llc -verify-machineinstrs -march=amdgcn -mcpu=tahiti -mattr=+max-private-element-size-16 < %s | FileCheck -check-prefix=GCN -check-prefix=SI -check-prefix=GCN-NO-TONGA %s
|
||||
; RUN: llc -verify-machineinstrs -march=amdgcn -mcpu=tonga -mattr=-flat-for-global -mattr=+max-private-element-size-16 < %s | FileCheck -check-prefix=GCN -check-prefix=SI -check-prefix=GCN-TONGA %s
|
||||
; RUN: llc -verify-machineinstrs -march=amdgcn -mtriple=amdgcn---amdgiz -mcpu=tahiti -mattr=+max-private-element-size-16 < %s | FileCheck -check-prefix=GCN -check-prefix=SI -check-prefix=GCN-NO-TONGA %s
|
||||
; RUN: llc -verify-machineinstrs -march=amdgcn -mtriple=amdgcn---amdgiz -mcpu=tonga -mattr=-flat-for-global -mattr=+max-private-element-size-16 < %s | FileCheck -check-prefix=GCN -check-prefix=SI -check-prefix=GCN-TONGA %s
|
||||
|
||||
; FIXME: Broken on evergreen
|
||||
; FIXME: For some reason the 8 and 16 vectors are being stored as
|
||||
|
@ -1,6 +1,6 @@
|
||||
; RUN: llc -march=amdgcn -mcpu=verde -mattr=+vgpr-spilling -verify-machineinstrs < %s | FileCheck --check-prefix=GCN --check-prefix=SI %s
|
||||
; RUN: llc -march=amdgcn -mcpu=gfx804 -mattr=-flat-for-global -mattr=+vgpr-spilling -verify-machineinstrs < %s | FileCheck --check-prefix=GCN --check-prefix=SI %s
|
||||
; RUN: llc -march=amdgcn -mcpu=gfx900 -mattr=-flat-for-global -mattr=+vgpr-spilling -verify-machineinstrs < %s | FileCheck --check-prefix=GCN --check-prefix=GFX9 %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -mcpu=verde -mattr=+vgpr-spilling -verify-machineinstrs < %s | FileCheck --check-prefix=GCN --check-prefix=SI %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -mcpu=gfx804 -mattr=-flat-for-global -mattr=+vgpr-spilling -verify-machineinstrs < %s | FileCheck --check-prefix=GCN --check-prefix=SI %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -mcpu=gfx900 -mattr=-flat-for-global -mattr=+vgpr-spilling -verify-machineinstrs < %s | FileCheck --check-prefix=GCN --check-prefix=GFX9 %s
|
||||
|
||||
; This used to fail due to a v_add_i32 instruction with an illegal immediate
|
||||
; operand that was created during Local Stack Slot Allocation. Test case derived
|
||||
|
@ -1,8 +1,8 @@
|
||||
; RUN: llc -march=amdgcn -mcpu=tahiti -mattr=+vgpr-spilling -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=GCNMESA -check-prefix=SIMESA %s
|
||||
; RUN: llc -march=amdgcn -mcpu=fiji -mattr=+vgpr-spilling,-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=GCNMESA -check-prefix=VIMESA %s
|
||||
; RUN: llc -march=amdgcn -mcpu=gfx900 -mattr=+vgpr-spilling,-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=GCNMESA -check-prefix=GFX9MESA %s
|
||||
; RUN: llc -march=amdgcn -mcpu=hawaii -mtriple=amdgcn-unknown-amdhsa -mattr=+vgpr-spilling -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=CIHSA -check-prefix=HSA %s
|
||||
; RUN: llc -march=amdgcn -mcpu=fiji -mtriple=amdgcn-unknown-amdhsa -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VIHSA -check-prefix=HSA %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -mcpu=tahiti -mattr=+vgpr-spilling -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=GCNMESA -check-prefix=SIMESA %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -mcpu=fiji -mattr=+vgpr-spilling,-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=GCNMESA -check-prefix=VIMESA %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -mcpu=gfx900 -mattr=+vgpr-spilling,-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=GCNMESA -check-prefix=GFX9MESA %s
|
||||
; RUN: llc -march=amdgcn -mcpu=hawaii -mtriple=amdgcn-unknown-amdhsa-amdgiz -mattr=+vgpr-spilling -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=CIHSA -check-prefix=HSA %s
|
||||
; RUN: llc -march=amdgcn -mcpu=fiji -mtriple=amdgcn-unknown-amdhsa-amdgiz -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VIHSA -check-prefix=HSA %s
|
||||
|
||||
; This ends up using all 256 registers and requires register
|
||||
; scavenging which will fail to find an unsued register.
|
||||
|
@ -1,6 +1,6 @@
|
||||
; RUN: llc -march=amdgcn -mcpu=tahiti -mattr=+vgpr-spilling -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI %s
|
||||
; RUN: llc -march=amdgcn -mcpu=fiji -mattr=+vgpr-spilling -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI %s
|
||||
; RUN: llc -march=amdgcn -mcpu=gfx900 -mattr=+vgpr-spilling -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=GFX9 %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -mcpu=tahiti -mattr=+vgpr-spilling -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -mcpu=fiji -mattr=+vgpr-spilling -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI %s
|
||||
; RUN: llc -march=amdgcn -mtriple=amdgcn---amdgiz -mcpu=gfx900 -mattr=+vgpr-spilling -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=GFX9 %s
|
||||
|
||||
; This ends up using all 255 registers and requires register
|
||||
; scavenging which will fail to find an unsued register.
|
||||
|
Loading…
Reference in New Issue
Block a user