mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-05 13:09:10 +00:00
If we are trying to create a ConstantExpr cast that is really a GEP to the
first element of an array, return a GEP instead of a cast. This allows us to transparently fold this: int* getelementptr (int* cast ([100 x int]* %Gbody to int*), int 40) into this: int* getelementptr ([100 x int]* %Gbody, int 0, int 40) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@16911 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5e94a21907
commit
f8d1097e9d
@ -562,6 +562,17 @@ Constant *llvm::ConstantFoldCastInstruction(const Constant *V,
|
||||
return ConstantExpr::getCast(CE->getOperand(0), DestTy);
|
||||
}
|
||||
|
||||
// Check to see if we are casting an array of X to a pointer to X. If so, use
|
||||
// a GEP to get to the first element of the array instead of a cast!
|
||||
if (const PointerType *PTy = dyn_cast<PointerType>(V->getType()))
|
||||
if (const ArrayType *ATy = dyn_cast<ArrayType>(PTy->getElementType()))
|
||||
if (const PointerType *DPTy = dyn_cast<PointerType>(DestTy))
|
||||
if (DPTy->getElementType() == ATy->getElementType()) {
|
||||
std::vector<Constant*> IdxList(2,Constant::getNullValue(Type::IntTy));
|
||||
return ConstantExpr::getGetElementPtr(const_cast<Constant*>(V),
|
||||
IdxList);
|
||||
}
|
||||
|
||||
ConstRules &Rules = ConstRules::get(V, V);
|
||||
|
||||
switch (DestTy->getTypeID()) {
|
||||
|
Loading…
Reference in New Issue
Block a user