mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-26 21:20:37 +00:00
More instcombine simplifications towards better debug locations.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@131596 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
631fcbf810
commit
107ffd58f7
@ -722,18 +722,39 @@ bool X86FastISel::X86SelectRet(const Instruction *I) {
|
||||
// Only handle register returns for now.
|
||||
if (!VA.isRegLoc())
|
||||
return false;
|
||||
// TODO: For now, don't try to handle cases where getLocInfo()
|
||||
// says Full but the types don't match.
|
||||
if (TLI.getValueType(RV->getType()) != VA.getValVT())
|
||||
return false;
|
||||
|
||||
// The calling-convention tables for x87 returns don't tell
|
||||
// the whole story.
|
||||
if (VA.getLocReg() == X86::ST0 || VA.getLocReg() == X86::ST1)
|
||||
return false;
|
||||
|
||||
// Make the copy.
|
||||
unsigned SrcReg = Reg + VA.getValNo();
|
||||
EVT SrcVT = TLI.getValueType(RV->getType());
|
||||
EVT DstVT = VA.getValVT();
|
||||
// Special handling for extended integers.
|
||||
if (SrcVT != DstVT) {
|
||||
return false;
|
||||
if (SrcVT != MVT::i1 && SrcVT != MVT::i8 && SrcVT != MVT::i16)
|
||||
return false;
|
||||
|
||||
if (!Outs[0].Flags.isZExt() && !Outs[0].Flags.isSExt())
|
||||
return false;
|
||||
|
||||
assert(DstVT == MVT::i32 && "X86 should always ext to i32");
|
||||
|
||||
if (SrcVT == MVT::i1) {
|
||||
if (Outs[0].Flags.isSExt())
|
||||
return false;
|
||||
SrcReg = FastEmitZExtFromI1(MVT::i8, SrcReg, /*TODO: Kill=*/false);
|
||||
SrcVT = MVT::i8;
|
||||
}
|
||||
unsigned Op = Outs[0].Flags.isZExt() ? ISD::ZERO_EXTEND :
|
||||
ISD::SIGN_EXTEND;
|
||||
SrcReg = FastEmit_r(SrcVT.getSimpleVT(), DstVT.getSimpleVT(), Op,
|
||||
SrcReg, /*TODO: Kill=*/false);
|
||||
}
|
||||
|
||||
// Make the copy.
|
||||
unsigned DstReg = VA.getLocReg();
|
||||
const TargetRegisterClass* SrcRC = MRI.getRegClass(SrcReg);
|
||||
// Avoid a cross-class copy. This is very unlikely.
|
||||
|
@ -1684,8 +1684,7 @@ Instruction *InstCombiner::visitBitCast(BitCastInst &CI) {
|
||||
// If we found a path from the src to dest, create the getelementptr now.
|
||||
if (SrcElTy == DstElTy) {
|
||||
SmallVector<Value*, 8> Idxs(NumZeros+1, ZeroUInt);
|
||||
return GetElementPtrInst::CreateInBounds(Src, Idxs.begin(), Idxs.end(),"",
|
||||
((Instruction*)NULL));
|
||||
return GetElementPtrInst::CreateInBounds(Src, Idxs.begin(), Idxs.end());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -469,8 +469,7 @@ FoldCmpLoadFromIndexedGlobal(GetElementPtrInst *GEP, GlobalVariable *GV,
|
||||
///
|
||||
/// If we can't emit an optimized form for this expression, this returns null.
|
||||
///
|
||||
static Value *EvaluateGEPOffsetExpression(User *GEP, Instruction &I,
|
||||
InstCombiner &IC) {
|
||||
static Value *EvaluateGEPOffsetExpression(User *GEP, InstCombiner &IC) {
|
||||
TargetData &TD = *IC.getTargetData();
|
||||
gep_type_iterator GTI = gep_type_begin(GEP);
|
||||
|
||||
@ -533,10 +532,10 @@ static Value *EvaluateGEPOffsetExpression(User *GEP, Instruction &I,
|
||||
// Cast to intptrty in case a truncation occurs. If an extension is needed,
|
||||
// we don't need to bother extending: the extension won't affect where the
|
||||
// computation crosses zero.
|
||||
if (VariableIdx->getType()->getPrimitiveSizeInBits() > IntPtrWidth)
|
||||
VariableIdx = new TruncInst(VariableIdx,
|
||||
TD.getIntPtrType(VariableIdx->getContext()),
|
||||
VariableIdx->getName(), &I);
|
||||
if (VariableIdx->getType()->getPrimitiveSizeInBits() > IntPtrWidth) {
|
||||
const Type *IntPtrTy = TD.getIntPtrType(VariableIdx->getContext());
|
||||
VariableIdx = IC.Builder->CreateTrunc(VariableIdx, IntPtrTy);
|
||||
}
|
||||
return VariableIdx;
|
||||
}
|
||||
|
||||
@ -558,11 +557,10 @@ static Value *EvaluateGEPOffsetExpression(User *GEP, Instruction &I,
|
||||
// Okay, we can do this evaluation. Start by converting the index to intptr.
|
||||
const Type *IntPtrTy = TD.getIntPtrType(VariableIdx->getContext());
|
||||
if (VariableIdx->getType() != IntPtrTy)
|
||||
VariableIdx = CastInst::CreateIntegerCast(VariableIdx, IntPtrTy,
|
||||
true /*SExt*/,
|
||||
VariableIdx->getName(), &I);
|
||||
VariableIdx = IC.Builder->CreateIntCast(VariableIdx, IntPtrTy,
|
||||
true /*Signed*/);
|
||||
Constant *OffsetVal = ConstantInt::get(IntPtrTy, NewOffs);
|
||||
return BinaryOperator::CreateAdd(VariableIdx, OffsetVal, "offset", &I);
|
||||
return IC.Builder->CreateAdd(VariableIdx, OffsetVal, "offset");
|
||||
}
|
||||
|
||||
/// FoldGEPICmp - Fold comparisons between a GEP instruction and something
|
||||
@ -580,7 +578,7 @@ Instruction *InstCombiner::FoldGEPICmp(GEPOperator *GEPLHS, Value *RHS,
|
||||
// This transformation (ignoring the base and scales) is valid because we
|
||||
// know pointers can't overflow since the gep is inbounds. See if we can
|
||||
// output an optimized form.
|
||||
Value *Offset = EvaluateGEPOffsetExpression(GEPLHS, I, *this);
|
||||
Value *Offset = EvaluateGEPOffsetExpression(GEPLHS, *this);
|
||||
|
||||
// If not, synthesize the offset the hard way.
|
||||
if (Offset == 0)
|
||||
|
Loading…
Reference in New Issue
Block a user