mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-06 04:18:00 +00:00
R600: Fix asserts related to constant initializers
This would assert if a constant address space was extern and therefore didn't have an initializer. If the initializer was undef, it would hit the unreachable unhandled initializer case. An extern global should never really occur since we don't have machine linking, but bugpoint likes to remove initializers. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210967 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -655,6 +655,14 @@ SDValue AMDGPUTargetLowering::LowerConstantInitializer(const Constant* Init,
|
|||||||
return DAG.getNode(ISD::TokenFactor, DL, MVT::Other, Chains);
|
return DAG.getNode(ISD::TokenFactor, DL, MVT::Other, Chains);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isa<UndefValue>(Init)) {
|
||||||
|
EVT VT = EVT::getEVT(InitTy);
|
||||||
|
PointerType *PtrTy = PointerType::get(InitTy, AMDGPUAS::PRIVATE_ADDRESS);
|
||||||
|
return DAG.getStore(Chain, DL, DAG.getUNDEF(VT), InitPtr,
|
||||||
|
MachinePointerInfo(UndefValue::get(PtrTy)), false, false,
|
||||||
|
TD->getPrefTypeAlignment(InitTy));
|
||||||
|
}
|
||||||
|
|
||||||
Init->dump();
|
Init->dump();
|
||||||
llvm_unreachable("Unhandled constant initializer");
|
llvm_unreachable("Unhandled constant initializer");
|
||||||
}
|
}
|
||||||
@@ -694,11 +702,19 @@ SDValue AMDGPUTargetLowering::LowerGlobalAddress(AMDGPUMachineFunction* MFI,
|
|||||||
unsigned Size = TD->getTypeAllocSize(EltType);
|
unsigned Size = TD->getTypeAllocSize(EltType);
|
||||||
unsigned Alignment = TD->getPrefTypeAlignment(EltType);
|
unsigned Alignment = TD->getPrefTypeAlignment(EltType);
|
||||||
|
|
||||||
const GlobalVariable *Var = cast<GlobalVariable>(GV);
|
MVT PrivPtrVT = getPointerTy(AMDGPUAS::PRIVATE_ADDRESS);
|
||||||
const Constant *Init = Var->getInitializer();
|
MVT ConstPtrVT = getPointerTy(AMDGPUAS::CONSTANT_ADDRESS);
|
||||||
|
|
||||||
int FI = FrameInfo->CreateStackObject(Size, Alignment, false);
|
int FI = FrameInfo->CreateStackObject(Size, Alignment, false);
|
||||||
SDValue InitPtr = DAG.getFrameIndex(FI,
|
SDValue InitPtr = DAG.getFrameIndex(FI, PrivPtrVT);
|
||||||
getPointerTy(AMDGPUAS::PRIVATE_ADDRESS));
|
|
||||||
|
const GlobalVariable *Var = cast<GlobalVariable>(GV);
|
||||||
|
if (!Var->hasInitializer()) {
|
||||||
|
// This has no use, but bugpoint will hit it.
|
||||||
|
return DAG.getZExtOrTrunc(InitPtr, SDLoc(Op), ConstPtrVT);
|
||||||
|
}
|
||||||
|
|
||||||
|
const Constant *Init = Var->getInitializer();
|
||||||
SmallVector<SDNode*, 8> WorkList;
|
SmallVector<SDNode*, 8> WorkList;
|
||||||
|
|
||||||
for (SDNode::use_iterator I = DAG.getEntryNode()->use_begin(),
|
for (SDNode::use_iterator I = DAG.getEntryNode()->use_begin(),
|
||||||
@@ -717,8 +733,7 @@ SDValue AMDGPUTargetLowering::LowerGlobalAddress(AMDGPUMachineFunction* MFI,
|
|||||||
}
|
}
|
||||||
DAG.UpdateNodeOperands(*I, Ops);
|
DAG.UpdateNodeOperands(*I, Ops);
|
||||||
}
|
}
|
||||||
return DAG.getZExtOrTrunc(InitPtr, SDLoc(Op),
|
return DAG.getZExtOrTrunc(InitPtr, SDLoc(Op), ConstPtrVT);
|
||||||
getPointerTy(AMDGPUAS::CONSTANT_ADDRESS));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
20
test/CodeGen/R600/no-initializer-constant-addrspace.ll
Normal file
20
test/CodeGen/R600/no-initializer-constant-addrspace.ll
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
; RUN: llc -march=r600 -mcpu=SI -o /dev/null %s
|
||||||
|
; RUN: llc -march=r600 -mcpu=cypress -o /dev/null %s
|
||||||
|
|
||||||
|
@extern_const_addrspace = external unnamed_addr addrspace(2) constant [5 x i32], align 4
|
||||||
|
|
||||||
|
; FUNC-LABEL: @load_extern_const_init
|
||||||
|
define void @load_extern_const_init(i32 addrspace(1)* %out) nounwind {
|
||||||
|
%val = load i32 addrspace(2)* getelementptr ([5 x i32] addrspace(2)* @extern_const_addrspace, i64 0, i64 3), align 4
|
||||||
|
store i32 %val, i32 addrspace(1)* %out, align 4
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
@undef_const_addrspace = unnamed_addr addrspace(2) constant [5 x i32] undef, align 4
|
||||||
|
|
||||||
|
; FUNC-LABEL: @load_undef_const_init
|
||||||
|
define void @load_undef_const_init(i32 addrspace(1)* %out) nounwind {
|
||||||
|
%val = load i32 addrspace(2)* getelementptr ([5 x i32] addrspace(2)* @undef_const_addrspace, i64 0, i64 3), align 4
|
||||||
|
store i32 %val, i32 addrspace(1)* %out, align 4
|
||||||
|
ret void
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user