From d57099a9ebbbdf5d2eac3c3c12be22e955813bdb Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Fri, 1 May 2009 17:13:31 +0000 Subject: [PATCH] Actually insert inserted instructions into the InsertedValues map. llvm-svn: 70557 --- .../llvm/Analysis/ScalarEvolutionExpander.h | 4 +- lib/Analysis/ScalarEvolutionExpander.cpp | 44 ++++++++++++++----- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/include/llvm/Analysis/ScalarEvolutionExpander.h b/include/llvm/Analysis/ScalarEvolutionExpander.h index bb3183dafa5..e06abd7c6bb 100644 --- a/include/llvm/Analysis/ScalarEvolutionExpander.h +++ b/include/llvm/Analysis/ScalarEvolutionExpander.h @@ -106,8 +106,8 @@ namespace llvm { /// InsertBinop - Insert the specified binary operator, doing a small amount /// of work to avoid inserting an obviously redundant operation. - static Value *InsertBinop(Instruction::BinaryOps Opcode, Value *LHS, - Value *RHS, BasicBlock::iterator InsertPt); + Value *InsertBinop(Instruction::BinaryOps Opcode, Value *LHS, + Value *RHS, BasicBlock::iterator InsertPt); private: Value *expand(const SCEV *S); diff --git a/lib/Analysis/ScalarEvolutionExpander.cpp b/lib/Analysis/ScalarEvolutionExpander.cpp index be91c0d7249..fd132746ad1 100644 --- a/lib/Analysis/ScalarEvolutionExpander.cpp +++ b/lib/Analysis/ScalarEvolutionExpander.cpp @@ -64,8 +64,10 @@ Value *SCEVExpander::InsertCastOfTo(Instruction::CastOps opcode, Value *V, return CI; } } - return CastInst::Create(opcode, V, Ty, V->getName(), - A->getParent()->getEntryBlock().begin()); + Instruction *I = CastInst::Create(opcode, V, Ty, V->getName(), + A->getParent()->getEntryBlock().begin()); + InsertedValues.insert(I); + return I; } Instruction *I = cast(V); @@ -93,7 +95,9 @@ Value *SCEVExpander::InsertCastOfTo(Instruction::CastOps opcode, Value *V, if (InvokeInst *II = dyn_cast(I)) IP = II->getNormalDest()->begin(); while (isa(IP)) ++IP; - return CastInst::Create(opcode, V, Ty, V->getName(), IP); + Instruction *CI = CastInst::Create(opcode, V, Ty, V->getName(), IP); + InsertedValues.insert(CI); + return CI; } /// InsertNoopCastOfTo - Insert a cast of V to the specified type, @@ -135,7 +139,9 @@ Value *SCEVExpander::InsertBinop(Instruction::BinaryOps Opcode, Value *LHS, } // If we haven't found this binop, insert it. - return BinaryOperator::Create(Opcode, LHS, RHS, "tmp", InsertPt); + Instruction *BO = BinaryOperator::Create(Opcode, LHS, RHS, "tmp", InsertPt); + InsertedValues.insert(BO); + return BO; } Value *SCEVExpander::visitAddExpr(const SCEVAddExpr *S) { @@ -218,6 +224,7 @@ Value *SCEVExpander::visitAddRecExpr(const SCEVAddRecExpr *S) { // specified loop. BasicBlock *Header = L->getHeader(); PHINode *PN = PHINode::Create(Ty, "indvar", Header->begin()); + InsertedValues.insert(PN); PN->addIncoming(Constant::getNullValue(Ty), L->getLoopPreheader()); pred_iterator HPI = pred_begin(Header); @@ -231,6 +238,7 @@ Value *SCEVExpander::visitAddRecExpr(const SCEVAddRecExpr *S) { Constant *One = ConstantInt::get(Ty, 1); Instruction *Add = BinaryOperator::CreateAdd(PN, One, "indvar.next", (*HPI)->getTerminator()); + InsertedValues.insert(Add); pred_iterator PI = pred_begin(Header); if (*PI == L->getLoopPreheader()) @@ -296,21 +304,27 @@ Value *SCEVExpander::visitTruncateExpr(const SCEVTruncateExpr *S) { const Type *Ty = SE.getEffectiveSCEVType(S->getType()); Value *V = expand(S->getOperand()); V = InsertNoopCastOfTo(V, SE.getEffectiveSCEVType(V->getType())); - return new TruncInst(V, Ty, "tmp.", InsertPt); + Instruction *I = new TruncInst(V, Ty, "tmp.", InsertPt); + InsertedValues.insert(I); + return I; } Value *SCEVExpander::visitZeroExtendExpr(const SCEVZeroExtendExpr *S) { const Type *Ty = SE.getEffectiveSCEVType(S->getType()); Value *V = expand(S->getOperand()); V = InsertNoopCastOfTo(V, SE.getEffectiveSCEVType(V->getType())); - return new ZExtInst(V, Ty, "tmp.", InsertPt); + Instruction *I = new ZExtInst(V, Ty, "tmp.", InsertPt); + InsertedValues.insert(I); + return I; } Value *SCEVExpander::visitSignExtendExpr(const SCEVSignExtendExpr *S) { const Type *Ty = SE.getEffectiveSCEVType(S->getType()); Value *V = expand(S->getOperand()); V = InsertNoopCastOfTo(V, SE.getEffectiveSCEVType(V->getType())); - return new SExtInst(V, Ty, "tmp.", InsertPt); + Instruction *I = new SExtInst(V, Ty, "tmp.", InsertPt); + InsertedValues.insert(I); + return I; } Value *SCEVExpander::visitSMaxExpr(const SCEVSMaxExpr *S) { @@ -320,8 +334,12 @@ Value *SCEVExpander::visitSMaxExpr(const SCEVSMaxExpr *S) { for (unsigned i = 1; i < S->getNumOperands(); ++i) { Value *RHS = expand(S->getOperand(i)); RHS = InsertNoopCastOfTo(RHS, Ty); - Value *ICmp = new ICmpInst(ICmpInst::ICMP_SGT, LHS, RHS, "tmp", InsertPt); - LHS = SelectInst::Create(ICmp, LHS, RHS, "smax", InsertPt); + Instruction *ICmp = + new ICmpInst(ICmpInst::ICMP_SGT, LHS, RHS, "tmp", InsertPt); + InsertedValues.insert(ICmp); + Instruction *Sel = SelectInst::Create(ICmp, LHS, RHS, "smax", InsertPt); + InsertedValues.insert(Sel); + LHS = Sel; } return LHS; } @@ -333,8 +351,12 @@ Value *SCEVExpander::visitUMaxExpr(const SCEVUMaxExpr *S) { for (unsigned i = 1; i < S->getNumOperands(); ++i) { Value *RHS = expand(S->getOperand(i)); RHS = InsertNoopCastOfTo(RHS, Ty); - Value *ICmp = new ICmpInst(ICmpInst::ICMP_UGT, LHS, RHS, "tmp", InsertPt); - LHS = SelectInst::Create(ICmp, LHS, RHS, "umax", InsertPt); + Instruction *ICmp = + new ICmpInst(ICmpInst::ICMP_UGT, LHS, RHS, "tmp", InsertPt); + InsertedValues.insert(ICmp); + Instruction *Sel = SelectInst::Create(ICmp, LHS, RHS, "umax", InsertPt); + InsertedValues.insert(Sel); + LHS = Sel; } return LHS; }