From 4c307d4a90063429fce59ec2074568d7854c9d26 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 22 Dec 2003 05:26:29 +0000 Subject: [PATCH] finegrainify namespacification Implement indvar analysis of getelementptr and sub expressions git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10582 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/InductionVariable.cpp | 31 ++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/lib/Analysis/InductionVariable.cpp b/lib/Analysis/InductionVariable.cpp index 6e9a209b7e1..8b805f8818e 100644 --- a/lib/Analysis/InductionVariable.cpp +++ b/lib/Analysis/InductionVariable.cpp @@ -27,16 +27,13 @@ #include "llvm/Analysis/LoopInfo.h" #include "llvm/Analysis/Expressions.h" #include "llvm/BasicBlock.h" -#include "llvm/iPHINode.h" -#include "llvm/iOperators.h" -#include "llvm/iTerminators.h" +#include "llvm/Instructions.h" #include "llvm/Type.h" #include "llvm/Constants.h" #include "llvm/Support/CFG.h" #include "llvm/Assembly/Writer.h" #include "Support/Debug.h" - -namespace llvm { +using namespace llvm; static bool isLoopInvariant(const Value *V, const Loop *L) { if (const Instruction *I = dyn_cast(V)) @@ -125,13 +122,33 @@ InductionVariable::InductionVariable(PHINode *P, LoopInfo *LoopInfo): End(0) { if (V2 == Phi) { // referencing the PHI directly? Must have zero step Step = Constant::getNullValue(Phi->getType()); } else if (BinaryOperator *I = dyn_cast(V2)) { - // TODO: This could be much better... if (I->getOpcode() == Instruction::Add) { if (I->getOperand(0) == Phi) Step = I->getOperand(1); else if (I->getOperand(1) == Phi) Step = I->getOperand(0); + } else if (I->getOpcode() == Instruction::Sub && + I->getOperand(0) == Phi) { + // If the incoming value is a constant, just form a constant negative + // step. Otherwise, negate the step outside of the loop and use it. + Value *V = I->getOperand(1); + Constant *Zero = Constant::getNullValue(V->getType()); + if (Constant *CV = dyn_cast(V)) + Step = ConstantExpr::get(Instruction::Sub, Zero, CV); + else if (Instruction *I = dyn_cast(V)) { + Step = BinaryOperator::create(Instruction::Sub, Zero, V, + V->getName()+".neg", I->getNext()); + + } else { + Step = BinaryOperator::create(Instruction::Sub, Zero, V, + V->getName()+".neg", + Phi->getParent()->getParent()->begin()->begin()); + } } + } else if (GetElementPtrInst *GEP = dyn_cast(V2)) { + if (GEP->getNumOperands() == 2 && + GEP->getOperand(0) == Phi) + Step = GEP->getOperand(1); } if (Step == 0) { // Unrecognized step value... @@ -301,5 +318,3 @@ void InductionVariable::print(std::ostream &o) const { } o << "\n"; } - -} // End llvm namespace -- 2.34.1