mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-13 23:25:06 +00:00
Add addrspacecast instruction.
Patch by Michele Scandale! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194760 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -2095,7 +2095,9 @@ bool CastInst::isNoopCast(Instruction::CastOps Opcode,
|
||||
case Instruction::SIToFP:
|
||||
case Instruction::FPToUI:
|
||||
case Instruction::FPToSI:
|
||||
return false; // These always modify bits
|
||||
case Instruction::AddrSpaceCast:
|
||||
// TODO: Target informations may give a more accurate answer here.
|
||||
return false;
|
||||
case Instruction::BitCast:
|
||||
return true; // BitCast never modifies bits.
|
||||
case Instruction::PtrToInt:
|
||||
@@ -2137,44 +2139,46 @@ unsigned CastInst::isEliminableCastPair(
|
||||
// ZEXT < Integral Unsigned Integer Any
|
||||
// SEXT < Integral Signed Integer Any
|
||||
// FPTOUI n/a FloatPt n/a Integral Unsigned
|
||||
// FPTOSI n/a FloatPt n/a Integral Signed
|
||||
// UITOFP n/a Integral Unsigned FloatPt n/a
|
||||
// SITOFP n/a Integral Signed FloatPt n/a
|
||||
// FPTRUNC > FloatPt n/a FloatPt n/a
|
||||
// FPEXT < FloatPt n/a FloatPt n/a
|
||||
// FPTOSI n/a FloatPt n/a Integral Signed
|
||||
// UITOFP n/a Integral Unsigned FloatPt n/a
|
||||
// SITOFP n/a Integral Signed FloatPt n/a
|
||||
// FPTRUNC > FloatPt n/a FloatPt n/a
|
||||
// FPEXT < FloatPt n/a FloatPt n/a
|
||||
// PTRTOINT n/a Pointer n/a Integral Unsigned
|
||||
// INTTOPTR n/a Integral Unsigned Pointer n/a
|
||||
// BITCAST = FirstClass n/a FirstClass n/a
|
||||
// BITCAST = FirstClass n/a FirstClass n/a
|
||||
// ADDRSPCST n/a Pointer n/a Pointer n/a
|
||||
//
|
||||
// NOTE: some transforms are safe, but we consider them to be non-profitable.
|
||||
// For example, we could merge "fptoui double to i32" + "zext i32 to i64",
|
||||
// into "fptoui double to i64", but this loses information about the range
|
||||
// of the produced value (we no longer know the top-part is all zeros).
|
||||
// of the produced value (we no longer know the top-part is all zeros).
|
||||
// Further this conversion is often much more expensive for typical hardware,
|
||||
// and causes issues when building libgcc. We disallow fptosi+sext for the
|
||||
// and causes issues when building libgcc. We disallow fptosi+sext for the
|
||||
// same reason.
|
||||
const unsigned numCastOps =
|
||||
const unsigned numCastOps =
|
||||
Instruction::CastOpsEnd - Instruction::CastOpsBegin;
|
||||
static const uint8_t CastResults[numCastOps][numCastOps] = {
|
||||
// T F F U S F F P I B -+
|
||||
// R Z S P P I I T P 2 N T |
|
||||
// U E E 2 2 2 2 R E I T C +- secondOp
|
||||
// N X X U S F F N X N 2 V |
|
||||
// C T T I I P P C T T P T -+
|
||||
{ 1, 0, 0,99,99, 0, 0,99,99,99, 0, 3 }, // Trunc -+
|
||||
{ 8, 1, 9,99,99, 2, 0,99,99,99, 2, 3 }, // ZExt |
|
||||
{ 8, 0, 1,99,99, 0, 2,99,99,99, 0, 3 }, // SExt |
|
||||
{ 0, 0, 0,99,99, 0, 0,99,99,99, 0, 3 }, // FPToUI |
|
||||
{ 0, 0, 0,99,99, 0, 0,99,99,99, 0, 3 }, // FPToSI |
|
||||
{ 99,99,99, 0, 0,99,99, 0, 0,99,99, 4 }, // UIToFP +- firstOp
|
||||
{ 99,99,99, 0, 0,99,99, 0, 0,99,99, 4 }, // SIToFP |
|
||||
{ 99,99,99, 0, 0,99,99, 1, 0,99,99, 4 }, // FPTrunc |
|
||||
{ 99,99,99, 2, 2,99,99,10, 2,99,99, 4 }, // FPExt |
|
||||
{ 1, 0, 0,99,99, 0, 0,99,99,99, 7, 3 }, // PtrToInt |
|
||||
{ 99,99,99,99,99,99,99,99,99,13,99,12 }, // IntToPtr |
|
||||
{ 5, 5, 5, 6, 6, 5, 5, 6, 6,11, 5, 1 }, // BitCast -+
|
||||
// T F F U S F F P I B A -+
|
||||
// R Z S P P I I T P 2 N T S |
|
||||
// U E E 2 2 2 2 R E I T C C +- secondOp
|
||||
// N X X U S F F N X N 2 V V |
|
||||
// C T T I I P P C T T P T T -+
|
||||
{ 1, 0, 0,99,99, 0, 0,99,99,99, 0, 3, 0}, // Trunc -+
|
||||
{ 8, 1, 9,99,99, 2, 0,99,99,99, 2, 3, 0}, // ZExt |
|
||||
{ 8, 0, 1,99,99, 0, 2,99,99,99, 0, 3, 0}, // SExt |
|
||||
{ 0, 0, 0,99,99, 0, 0,99,99,99, 0, 3, 0}, // FPToUI |
|
||||
{ 0, 0, 0,99,99, 0, 0,99,99,99, 0, 3, 0}, // FPToSI |
|
||||
{ 99,99,99, 0, 0,99,99, 0, 0,99,99, 4, 0}, // UIToFP +- firstOp
|
||||
{ 99,99,99, 0, 0,99,99, 0, 0,99,99, 4, 0}, // SIToFP |
|
||||
{ 99,99,99, 0, 0,99,99, 1, 0,99,99, 4, 0}, // FPTrunc |
|
||||
{ 99,99,99, 2, 2,99,99,10, 2,99,99, 4, 0}, // FPExt |
|
||||
{ 1, 0, 0,99,99, 0, 0,99,99,99, 7, 3, 0}, // PtrToInt |
|
||||
{ 99,99,99,99,99,99,99,99,99,11,99,15, 0}, // IntToPtr |
|
||||
{ 5, 5, 5, 6, 6, 5, 5, 6, 6,16, 5, 1,14}, // BitCast |
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,13,12}, // AddrSpaceCast -+
|
||||
};
|
||||
|
||||
|
||||
// If either of the casts are a bitcast from scalar to vector, disallow the
|
||||
// merging. However, bitcast of A->B->A are allowed.
|
||||
bool isFirstBitcast = (firstOp == Instruction::BitCast);
|
||||
@@ -2191,47 +2195,50 @@ unsigned CastInst::isEliminableCastPair(
|
||||
[secondOp-Instruction::CastOpsBegin];
|
||||
switch (ElimCase) {
|
||||
case 0:
|
||||
// categorically disallowed
|
||||
// Categorically disallowed.
|
||||
return 0;
|
||||
case 1:
|
||||
// allowed, use first cast's opcode
|
||||
// Allowed, use first cast's opcode.
|
||||
return firstOp;
|
||||
case 2:
|
||||
// allowed, use second cast's opcode
|
||||
// Allowed, use second cast's opcode.
|
||||
return secondOp;
|
||||
case 3:
|
||||
// no-op cast in second op implies firstOp as long as the DestTy
|
||||
// No-op cast in second op implies firstOp as long as the DestTy
|
||||
// is integer and we are not converting between a vector and a
|
||||
// non vector type.
|
||||
if (!SrcTy->isVectorTy() && DstTy->isIntegerTy())
|
||||
return firstOp;
|
||||
return 0;
|
||||
case 4:
|
||||
// no-op cast in second op implies firstOp as long as the DestTy
|
||||
// No-op cast in second op implies firstOp as long as the DestTy
|
||||
// is floating point.
|
||||
if (DstTy->isFloatingPointTy())
|
||||
return firstOp;
|
||||
return 0;
|
||||
case 5:
|
||||
// no-op cast in first op implies secondOp as long as the SrcTy
|
||||
// No-op cast in first op implies secondOp as long as the SrcTy
|
||||
// is an integer.
|
||||
if (SrcTy->isIntegerTy())
|
||||
return secondOp;
|
||||
return 0;
|
||||
case 6:
|
||||
// no-op cast in first op implies secondOp as long as the SrcTy
|
||||
// No-op cast in first op implies secondOp as long as the SrcTy
|
||||
// is a floating point.
|
||||
if (SrcTy->isFloatingPointTy())
|
||||
return secondOp;
|
||||
return 0;
|
||||
case 7: {
|
||||
// Cannot simplify if address spaces are different!
|
||||
if (SrcTy->getPointerAddressSpace() != DstTy->getPointerAddressSpace())
|
||||
return 0;
|
||||
|
||||
unsigned MidSize = MidTy->getScalarSizeInBits();
|
||||
// Check the address spaces first. If we know they are in the same address
|
||||
// space, the pointer sizes must be the same so we can still fold this
|
||||
// without knowing the actual sizes as long we know that the intermediate
|
||||
// pointer is the largest possible pointer size.
|
||||
if (MidSize == 64 &&
|
||||
SrcTy->getPointerAddressSpace() == DstTy->getPointerAddressSpace())
|
||||
// We can still fold this without knowing the actual sizes as long we
|
||||
// know that the intermediate pointer is the largest possible
|
||||
// pointer size.
|
||||
// FIXME: Is this always true?
|
||||
if (MidSize == 64)
|
||||
return Instruction::BitCast;
|
||||
|
||||
// ptrtoint, inttoptr -> bitcast (ptr -> ptr) if int size is >= ptr size.
|
||||
@@ -2254,7 +2261,8 @@ unsigned CastInst::isEliminableCastPair(
|
||||
return firstOp;
|
||||
return secondOp;
|
||||
}
|
||||
case 9: // zext, sext -> zext, because sext can't sign extend after zext
|
||||
case 9:
|
||||
// zext, sext -> zext, because sext can't sign extend after zext
|
||||
return Instruction::ZExt;
|
||||
case 10:
|
||||
// fpext followed by ftrunc is allowed if the bit size returned to is
|
||||
@@ -2263,46 +2271,6 @@ unsigned CastInst::isEliminableCastPair(
|
||||
return Instruction::BitCast;
|
||||
return 0; // If the types are not the same we can't eliminate it.
|
||||
case 11: {
|
||||
// bitcast followed by ptrtoint is allowed as long as the bitcast is a
|
||||
// pointer to pointer cast, and the pointers are the same size.
|
||||
PointerType *SrcPtrTy = dyn_cast<PointerType>(SrcTy);
|
||||
PointerType *MidPtrTy = dyn_cast<PointerType>(MidTy);
|
||||
if (!SrcPtrTy || !MidPtrTy)
|
||||
return 0;
|
||||
|
||||
// If the address spaces are the same, we know they are the same size
|
||||
// without size information
|
||||
if (SrcPtrTy->getAddressSpace() == MidPtrTy->getAddressSpace())
|
||||
return secondOp;
|
||||
|
||||
if (!SrcIntPtrTy || !MidIntPtrTy)
|
||||
return 0;
|
||||
|
||||
if (SrcIntPtrTy->getScalarSizeInBits() ==
|
||||
MidIntPtrTy->getScalarSizeInBits())
|
||||
return secondOp;
|
||||
|
||||
return 0;
|
||||
}
|
||||
case 12: {
|
||||
// inttoptr, bitcast -> inttoptr if bitcast is a ptr to ptr cast
|
||||
// and the ptrs are to address spaces of the same size
|
||||
PointerType *MidPtrTy = dyn_cast<PointerType>(MidTy);
|
||||
PointerType *DstPtrTy = dyn_cast<PointerType>(DstTy);
|
||||
if (!MidPtrTy || !DstPtrTy)
|
||||
return 0;
|
||||
|
||||
if (MidPtrTy->getAddressSpace() == DstPtrTy->getAddressSpace())
|
||||
return firstOp;
|
||||
|
||||
if (MidIntPtrTy &&
|
||||
DstIntPtrTy &&
|
||||
MidIntPtrTy->getScalarSizeInBits() ==
|
||||
DstIntPtrTy->getScalarSizeInBits())
|
||||
return firstOp;
|
||||
return 0;
|
||||
}
|
||||
case 13: {
|
||||
// inttoptr, ptrtoint -> bitcast if SrcSize<=PtrSize and SrcSize==DstSize
|
||||
if (!MidIntPtrTy)
|
||||
return 0;
|
||||
@@ -2313,8 +2281,65 @@ unsigned CastInst::isEliminableCastPair(
|
||||
return Instruction::BitCast;
|
||||
return 0;
|
||||
}
|
||||
case 12: {
|
||||
// addrspacecast, addrspacecast -> bitcast, if SrcAS == DstAS
|
||||
// addrspacecast, addrspacecast -> addrspacecast, if SrcAS != DstAS
|
||||
if (SrcTy->getPointerAddressSpace() != DstTy->getPointerAddressSpace())
|
||||
return Instruction::AddrSpaceCast;
|
||||
return Instruction::BitCast;
|
||||
}
|
||||
case 13:
|
||||
// FIXME: this state can be merged with (1), but the following assert
|
||||
// is useful to check the correcteness of the sequence due to semantic
|
||||
// change of bitcast.
|
||||
assert(
|
||||
SrcTy->isPtrOrPtrVectorTy() &&
|
||||
MidTy->isPtrOrPtrVectorTy() &&
|
||||
DstTy->isPtrOrPtrVectorTy() &&
|
||||
SrcTy->getPointerAddressSpace() != MidTy->getPointerAddressSpace() &&
|
||||
MidTy->getPointerAddressSpace() == DstTy->getPointerAddressSpace() &&
|
||||
"Illegal addrspacecast, bitcast sequence!");
|
||||
// Allowed, use first cast's opcode
|
||||
return firstOp;
|
||||
case 14:
|
||||
// FIXME: this state can be merged with (2), but the following assert
|
||||
// is useful to check the correcteness of the sequence due to semantic
|
||||
// change of bitcast.
|
||||
assert(
|
||||
SrcTy->isPtrOrPtrVectorTy() &&
|
||||
MidTy->isPtrOrPtrVectorTy() &&
|
||||
DstTy->isPtrOrPtrVectorTy() &&
|
||||
SrcTy->getPointerAddressSpace() == MidTy->getPointerAddressSpace() &&
|
||||
MidTy->getPointerAddressSpace() != DstTy->getPointerAddressSpace() &&
|
||||
"Illegal bitcast, addrspacecast sequence!");
|
||||
// Allowed, use second cast's opcode
|
||||
return secondOp;
|
||||
case 15:
|
||||
// FIXME: this state can be merged with (1), but the following assert
|
||||
// is useful to check the correcteness of the sequence due to semantic
|
||||
// change of bitcast.
|
||||
assert(
|
||||
SrcTy->isIntOrIntVectorTy() &&
|
||||
MidTy->isPtrOrPtrVectorTy() &&
|
||||
DstTy->isPtrOrPtrVectorTy() &&
|
||||
MidTy->getPointerAddressSpace() == DstTy->getPointerAddressSpace() &&
|
||||
"Illegal inttoptr, bitcast sequence!");
|
||||
// Allowed, use first cast's opcode
|
||||
return firstOp;
|
||||
case 16:
|
||||
// FIXME: this state can be merged with (2), but the following assert
|
||||
// is useful to check the correcteness of the sequence due to semantic
|
||||
// change of bitcast.
|
||||
assert(
|
||||
SrcTy->isPtrOrPtrVectorTy() &&
|
||||
MidTy->isPtrOrPtrVectorTy() &&
|
||||
DstTy->isIntOrIntVectorTy() &&
|
||||
SrcTy->getPointerAddressSpace() == MidTy->getPointerAddressSpace() &&
|
||||
"Illegal bitcast, ptrtoint sequence!");
|
||||
// Allowed, use second cast's opcode
|
||||
return secondOp;
|
||||
case 99:
|
||||
// cast combination can't happen (error in input). This is for all cases
|
||||
// Cast combination can't happen (error in input). This is for all cases
|
||||
// where the MidTy is not the same for the two cast instructions.
|
||||
llvm_unreachable("Invalid Cast Combination");
|
||||
default:
|
||||
@@ -2327,19 +2352,20 @@ CastInst *CastInst::Create(Instruction::CastOps op, Value *S, Type *Ty,
|
||||
assert(castIsValid(op, S, Ty) && "Invalid cast!");
|
||||
// Construct and return the appropriate CastInst subclass
|
||||
switch (op) {
|
||||
case Trunc: return new TruncInst (S, Ty, Name, InsertBefore);
|
||||
case ZExt: return new ZExtInst (S, Ty, Name, InsertBefore);
|
||||
case SExt: return new SExtInst (S, Ty, Name, InsertBefore);
|
||||
case FPTrunc: return new FPTruncInst (S, Ty, Name, InsertBefore);
|
||||
case FPExt: return new FPExtInst (S, Ty, Name, InsertBefore);
|
||||
case UIToFP: return new UIToFPInst (S, Ty, Name, InsertBefore);
|
||||
case SIToFP: return new SIToFPInst (S, Ty, Name, InsertBefore);
|
||||
case FPToUI: return new FPToUIInst (S, Ty, Name, InsertBefore);
|
||||
case FPToSI: return new FPToSIInst (S, Ty, Name, InsertBefore);
|
||||
case PtrToInt: return new PtrToIntInst (S, Ty, Name, InsertBefore);
|
||||
case IntToPtr: return new IntToPtrInst (S, Ty, Name, InsertBefore);
|
||||
case BitCast: return new BitCastInst (S, Ty, Name, InsertBefore);
|
||||
default: llvm_unreachable("Invalid opcode provided");
|
||||
case Trunc: return new TruncInst (S, Ty, Name, InsertBefore);
|
||||
case ZExt: return new ZExtInst (S, Ty, Name, InsertBefore);
|
||||
case SExt: return new SExtInst (S, Ty, Name, InsertBefore);
|
||||
case FPTrunc: return new FPTruncInst (S, Ty, Name, InsertBefore);
|
||||
case FPExt: return new FPExtInst (S, Ty, Name, InsertBefore);
|
||||
case UIToFP: return new UIToFPInst (S, Ty, Name, InsertBefore);
|
||||
case SIToFP: return new SIToFPInst (S, Ty, Name, InsertBefore);
|
||||
case FPToUI: return new FPToUIInst (S, Ty, Name, InsertBefore);
|
||||
case FPToSI: return new FPToSIInst (S, Ty, Name, InsertBefore);
|
||||
case PtrToInt: return new PtrToIntInst (S, Ty, Name, InsertBefore);
|
||||
case IntToPtr: return new IntToPtrInst (S, Ty, Name, InsertBefore);
|
||||
case BitCast: return new BitCastInst (S, Ty, Name, InsertBefore);
|
||||
case AddrSpaceCast: return new AddrSpaceCastInst (S, Ty, Name, InsertBefore);
|
||||
default: llvm_unreachable("Invalid opcode provided");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2348,19 +2374,20 @@ CastInst *CastInst::Create(Instruction::CastOps op, Value *S, Type *Ty,
|
||||
assert(castIsValid(op, S, Ty) && "Invalid cast!");
|
||||
// Construct and return the appropriate CastInst subclass
|
||||
switch (op) {
|
||||
case Trunc: return new TruncInst (S, Ty, Name, InsertAtEnd);
|
||||
case ZExt: return new ZExtInst (S, Ty, Name, InsertAtEnd);
|
||||
case SExt: return new SExtInst (S, Ty, Name, InsertAtEnd);
|
||||
case FPTrunc: return new FPTruncInst (S, Ty, Name, InsertAtEnd);
|
||||
case FPExt: return new FPExtInst (S, Ty, Name, InsertAtEnd);
|
||||
case UIToFP: return new UIToFPInst (S, Ty, Name, InsertAtEnd);
|
||||
case SIToFP: return new SIToFPInst (S, Ty, Name, InsertAtEnd);
|
||||
case FPToUI: return new FPToUIInst (S, Ty, Name, InsertAtEnd);
|
||||
case FPToSI: return new FPToSIInst (S, Ty, Name, InsertAtEnd);
|
||||
case PtrToInt: return new PtrToIntInst (S, Ty, Name, InsertAtEnd);
|
||||
case IntToPtr: return new IntToPtrInst (S, Ty, Name, InsertAtEnd);
|
||||
case BitCast: return new BitCastInst (S, Ty, Name, InsertAtEnd);
|
||||
default: llvm_unreachable("Invalid opcode provided");
|
||||
case Trunc: return new TruncInst (S, Ty, Name, InsertAtEnd);
|
||||
case ZExt: return new ZExtInst (S, Ty, Name, InsertAtEnd);
|
||||
case SExt: return new SExtInst (S, Ty, Name, InsertAtEnd);
|
||||
case FPTrunc: return new FPTruncInst (S, Ty, Name, InsertAtEnd);
|
||||
case FPExt: return new FPExtInst (S, Ty, Name, InsertAtEnd);
|
||||
case UIToFP: return new UIToFPInst (S, Ty, Name, InsertAtEnd);
|
||||
case SIToFP: return new SIToFPInst (S, Ty, Name, InsertAtEnd);
|
||||
case FPToUI: return new FPToUIInst (S, Ty, Name, InsertAtEnd);
|
||||
case FPToSI: return new FPToSIInst (S, Ty, Name, InsertAtEnd);
|
||||
case PtrToInt: return new PtrToIntInst (S, Ty, Name, InsertAtEnd);
|
||||
case IntToPtr: return new IntToPtrInst (S, Ty, Name, InsertAtEnd);
|
||||
case BitCast: return new BitCastInst (S, Ty, Name, InsertAtEnd);
|
||||
case AddrSpaceCast: return new AddrSpaceCastInst (S, Ty, Name, InsertAtEnd);
|
||||
default: llvm_unreachable("Invalid opcode provided");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2425,6 +2452,11 @@ CastInst *CastInst::CreatePointerCast(Value *S, Type *Ty,
|
||||
|
||||
if (Ty->isIntOrIntVectorTy())
|
||||
return Create(Instruction::PtrToInt, S, Ty, Name, InsertAtEnd);
|
||||
|
||||
Type *STy = S->getType();
|
||||
if (STy->getPointerAddressSpace() != Ty->getPointerAddressSpace())
|
||||
return Create(Instruction::AddrSpaceCast, S, Ty, Name, InsertAtEnd);
|
||||
|
||||
return Create(Instruction::BitCast, S, Ty, Name, InsertAtEnd);
|
||||
}
|
||||
|
||||
@@ -2442,6 +2474,11 @@ CastInst *CastInst::CreatePointerCast(Value *S, Type *Ty,
|
||||
|
||||
if (Ty->isIntOrIntVectorTy())
|
||||
return Create(Instruction::PtrToInt, S, Ty, Name, InsertBefore);
|
||||
|
||||
Type *STy = S->getType();
|
||||
if (STy->getPointerAddressSpace() != Ty->getPointerAddressSpace())
|
||||
return Create(Instruction::AddrSpaceCast, S, Ty, Name, InsertBefore);
|
||||
|
||||
return Create(Instruction::BitCast, S, Ty, Name, InsertBefore);
|
||||
}
|
||||
|
||||
@@ -2687,7 +2724,8 @@ CastInst::getCastOpcode(
|
||||
return BitCast;
|
||||
} else if (DestTy->isPointerTy()) {
|
||||
if (SrcTy->isPointerTy()) {
|
||||
// TODO: Address space pointer sizes may not match
|
||||
if (DestTy->getPointerAddressSpace() != SrcTy->getPointerAddressSpace())
|
||||
return AddrSpaceCast;
|
||||
return BitCast; // ptr -> ptr
|
||||
} else if (SrcTy->isIntegerTy()) {
|
||||
return IntToPtr; // int -> ptr
|
||||
@@ -2782,13 +2820,27 @@ CastInst::castIsValid(Instruction::CastOps op, Value *S, Type *DstTy) {
|
||||
case Instruction::BitCast:
|
||||
// BitCast implies a no-op cast of type only. No bits change.
|
||||
// However, you can't cast pointers to anything but pointers.
|
||||
if (SrcTy->isPointerTy() != DstTy->isPointerTy())
|
||||
if (SrcTy->isPtrOrPtrVectorTy() != DstTy->isPtrOrPtrVectorTy())
|
||||
return false;
|
||||
|
||||
// Now we know we're not dealing with a pointer/non-pointer mismatch. In all
|
||||
// these cases, the cast is okay if the source and destination bit widths
|
||||
// are identical.
|
||||
return SrcTy->getPrimitiveSizeInBits() == DstTy->getPrimitiveSizeInBits();
|
||||
// For non pointer cases, the cast is okay if the source and destination bit
|
||||
// widths are identical.
|
||||
if (!SrcTy->isPtrOrPtrVectorTy())
|
||||
return SrcTy->getPrimitiveSizeInBits() == DstTy->getPrimitiveSizeInBits();
|
||||
|
||||
// If both are pointers then the address spaces must match and vector of
|
||||
// pointers must have the same number of elements.
|
||||
return SrcTy->getPointerAddressSpace() == DstTy->getPointerAddressSpace() &&
|
||||
SrcTy->isVectorTy() == DstTy->isVectorTy() &&
|
||||
(!SrcTy->isVectorTy() ||
|
||||
SrcTy->getVectorNumElements() == SrcTy->getVectorNumElements());
|
||||
|
||||
case Instruction::AddrSpaceCast:
|
||||
return SrcTy->isPtrOrPtrVectorTy() && DstTy->isPtrOrPtrVectorTy() &&
|
||||
SrcTy->getPointerAddressSpace() != DstTy->getPointerAddressSpace() &&
|
||||
SrcTy->isVectorTy() == DstTy->isVectorTy() &&
|
||||
(!SrcTy->isVectorTy() ||
|
||||
SrcTy->getVectorNumElements() == SrcTy->getVectorNumElements());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2935,6 +2987,18 @@ BitCastInst::BitCastInst(
|
||||
assert(castIsValid(getOpcode(), S, Ty) && "Illegal BitCast");
|
||||
}
|
||||
|
||||
AddrSpaceCastInst::AddrSpaceCastInst(
|
||||
Value *S, Type *Ty, const Twine &Name, Instruction *InsertBefore
|
||||
) : CastInst(Ty, AddrSpaceCast, S, Name, InsertBefore) {
|
||||
assert(castIsValid(getOpcode(), S, Ty) && "Illegal AddrSpaceCast");
|
||||
}
|
||||
|
||||
AddrSpaceCastInst::AddrSpaceCastInst(
|
||||
Value *S, Type *Ty, const Twine &Name, BasicBlock *InsertAtEnd
|
||||
) : CastInst(Ty, AddrSpaceCast, S, Name, InsertAtEnd) {
|
||||
assert(castIsValid(getOpcode(), S, Ty) && "Illegal AddrSpaceCast");
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// CmpInst Classes
|
||||
//===----------------------------------------------------------------------===//
|
||||
@@ -3553,6 +3617,10 @@ BitCastInst *BitCastInst::clone_impl() const {
|
||||
return new BitCastInst(getOperand(0), getType());
|
||||
}
|
||||
|
||||
AddrSpaceCastInst *AddrSpaceCastInst::clone_impl() const {
|
||||
return new AddrSpaceCastInst(getOperand(0), getType());
|
||||
}
|
||||
|
||||
CallInst *CallInst::clone_impl() const {
|
||||
return new(getNumOperands()) CallInst(*this);
|
||||
}
|
||||
|
Reference in New Issue
Block a user