mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 04:30:12 +00:00
Fix CodeGen for different size address space GEPs
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193111 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
244d245974
commit
ff71812dfa
@ -1513,7 +1513,7 @@ static const MCExpr *lowerConstant(const Constant *CV, AsmPrinter &AP) {
|
||||
case Instruction::GetElementPtr: {
|
||||
const DataLayout &DL = *AP.TM.getDataLayout();
|
||||
// Generate a symbolic expression for the byte address
|
||||
APInt OffsetAI(DL.getPointerSizeInBits(), 0);
|
||||
APInt OffsetAI(DL.getPointerTypeSizeInBits(CE->getType()), 0);
|
||||
cast<GEPOperator>(CE)->accumulateConstantOffset(DL, OffsetAI);
|
||||
|
||||
const MCExpr *Base = lowerConstant(CE->getOperand(0), AP);
|
||||
@ -1539,7 +1539,7 @@ static const MCExpr *lowerConstant(const Constant *CV, AsmPrinter &AP) {
|
||||
// Handle casts to pointers by changing them into casts to the appropriate
|
||||
// integer type. This promotes constant folding and simplifies this code.
|
||||
Constant *Op = CE->getOperand(0);
|
||||
Op = ConstantExpr::getIntegerCast(Op, DL.getIntPtrType(CV->getContext()),
|
||||
Op = ConstantExpr::getIntegerCast(Op, DL.getIntPtrType(CV->getType()),
|
||||
false/*ZExt*/);
|
||||
return lowerConstant(Op, AP);
|
||||
}
|
||||
|
@ -3229,10 +3229,12 @@ void SelectionDAGBuilder::visitExtractValue(const ExtractValueInst &I) {
|
||||
}
|
||||
|
||||
void SelectionDAGBuilder::visitGetElementPtr(const User &I) {
|
||||
SDValue N = getValue(I.getOperand(0));
|
||||
Value *Op0 = I.getOperand(0);
|
||||
// Note that the pointer operand may be a vector of pointers. Take the scalar
|
||||
// element which holds a pointer.
|
||||
Type *Ty = I.getOperand(0)->getType()->getScalarType();
|
||||
Type *Ty = Op0->getType()->getScalarType();
|
||||
unsigned AS = Ty->getPointerAddressSpace();
|
||||
SDValue N = getValue(Op0);
|
||||
|
||||
for (GetElementPtrInst::const_op_iterator OI = I.op_begin()+1, E = I.op_end();
|
||||
OI != E; ++OI) {
|
||||
@ -3248,10 +3250,6 @@ void SelectionDAGBuilder::visitGetElementPtr(const User &I) {
|
||||
|
||||
Ty = StTy->getElementType(Field);
|
||||
} else {
|
||||
uint32_t AS = 0;
|
||||
if (PointerType *PtrType = dyn_cast<PointerType>(Ty)) {
|
||||
AS = PtrType->getAddressSpace();
|
||||
}
|
||||
Ty = cast<SequentialType>(Ty)->getElementType();
|
||||
|
||||
// If this is a constant subscript, handle it quickly.
|
||||
|
10
test/CodeGen/R600/gep-address-space.ll
Normal file
10
test/CodeGen/R600/gep-address-space.ll
Normal file
@ -0,0 +1,10 @@
|
||||
; RUN: llc -march=r600 -mcpu=SI < %s | FileCheck %s
|
||||
|
||||
define void @use_gep_address_space([1024 x i32] addrspace(3)* %array) nounwind {
|
||||
; CHECK-LABEL @use_gep_address_space:
|
||||
; CHECK: ADD_I32
|
||||
%p = getelementptr [1024 x i32] addrspace(3)* %array, i16 0, i16 16
|
||||
store i32 99, i32 addrspace(3)* %p
|
||||
ret void
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user