mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-25 17:20:48 +00:00
Factor out the code for sign-extending/truncating gep indices
and use it in x86 address mode folding. Also, make getRegForValue return 0 for illegal types even if it has a ValueMap for them, because Argument values are put in the ValueMap. This fixes PR3181. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60696 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -55,6 +55,19 @@
|
||||
using namespace llvm;
|
||||
|
||||
unsigned FastISel::getRegForValue(Value *V) {
|
||||
MVT::SimpleValueType VT = TLI.getValueType(V->getType()).getSimpleVT();
|
||||
|
||||
// Ignore illegal types. We must do this before looking up the value
|
||||
// in ValueMap because Arguments are given virtual registers regardless
|
||||
// of whether FastISel can handle them.
|
||||
if (!TLI.isTypeLegal(VT)) {
|
||||
// Promote MVT::i1 to a legal type though, because it's common and easy.
|
||||
if (VT == MVT::i1)
|
||||
VT = TLI.getTypeToTransformTo(VT).getSimpleVT();
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Look up the value to see if we already have a register for it. We
|
||||
// cache values defined by Instructions across blocks, and other values
|
||||
// only locally. This is because Instructions already have the SSA
|
||||
@@ -65,17 +78,6 @@ unsigned FastISel::getRegForValue(Value *V) {
|
||||
if (Reg != 0)
|
||||
return Reg;
|
||||
|
||||
MVT::SimpleValueType VT = TLI.getValueType(V->getType()).getSimpleVT();
|
||||
|
||||
// Ignore illegal types.
|
||||
if (!TLI.isTypeLegal(VT)) {
|
||||
// Promote MVT::i1 to a legal type though, because it's common and easy.
|
||||
if (VT == MVT::i1)
|
||||
VT = TLI.getTypeToTransformTo(VT).getSimpleVT();
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
|
||||
if (CI->getValue().getActiveBits() <= 64)
|
||||
Reg = FastEmit_i(VT, VT, ISD::Constant, CI->getZExtValue());
|
||||
@@ -153,6 +155,24 @@ void FastISel::UpdateValueMap(Value* I, unsigned Reg) {
|
||||
Reg, MRI.getRegClass(Reg), MRI.getRegClass(Reg));
|
||||
}
|
||||
|
||||
unsigned FastISel::getRegForGEPIndex(Value *Idx) {
|
||||
unsigned IdxN = getRegForValue(Idx);
|
||||
if (IdxN == 0)
|
||||
// Unhandled operand. Halt "fast" selection and bail.
|
||||
return 0;
|
||||
|
||||
// If the index is smaller or larger than intptr_t, truncate or extend it.
|
||||
MVT PtrVT = TLI.getPointerTy();
|
||||
MVT IdxVT = MVT::getMVT(Idx->getType(), /*HandleUnknown=*/false);
|
||||
if (IdxVT.bitsLT(PtrVT))
|
||||
IdxN = FastEmit_r(IdxVT.getSimpleVT(), PtrVT.getSimpleVT(),
|
||||
ISD::SIGN_EXTEND, IdxN);
|
||||
else if (IdxVT.bitsGT(PtrVT))
|
||||
IdxN = FastEmit_r(IdxVT.getSimpleVT(), PtrVT.getSimpleVT(),
|
||||
ISD::TRUNCATE, IdxN);
|
||||
return IdxN;
|
||||
}
|
||||
|
||||
/// SelectBinaryOp - Select and emit code for a binary operator instruction,
|
||||
/// which has an opcode which directly corresponds to the given ISD opcode.
|
||||
///
|
||||
@@ -263,18 +283,7 @@ bool FastISel::SelectGetElementPtr(User *I) {
|
||||
|
||||
// N = N + Idx * ElementSize;
|
||||
uint64_t ElementSize = TD.getABITypeSize(Ty);
|
||||
unsigned IdxN = getRegForValue(Idx);
|
||||
if (IdxN == 0)
|
||||
// Unhandled operand. Halt "fast" selection and bail.
|
||||
return false;
|
||||
|
||||
// If the index is smaller or larger than intptr_t, truncate or extend
|
||||
// it.
|
||||
MVT IdxVT = MVT::getMVT(Idx->getType(), /*HandleUnknown=*/false);
|
||||
if (IdxVT.bitsLT(VT))
|
||||
IdxN = FastEmit_r(IdxVT.getSimpleVT(), VT, ISD::SIGN_EXTEND, IdxN);
|
||||
else if (IdxVT.bitsGT(VT))
|
||||
IdxN = FastEmit_r(IdxVT.getSimpleVT(), VT, ISD::TRUNCATE, IdxN);
|
||||
unsigned IdxN = getRegForGEPIndex(Idx);
|
||||
if (IdxN == 0)
|
||||
// Unhandled operand. Halt "fast" selection and bail.
|
||||
return false;
|
||||
|
Reference in New Issue
Block a user