[llvm-commits] [llvm] r77437 - in /llvm/trunk: include/llvm/Analysis/LoopDependenceAnalysis.h lib/Analysis/LoopDependenceAnalysis.cpp

Andreas Bolka a at bolka.at
Tue Jul 28 22:35:53 PDT 2009


Author: abolka
Date: Wed Jul 29 00:35:53 2009
New Revision: 77437

URL: http://llvm.org/viewvc/llvm-project?rev=77437&view=rev
Log:
Skeleton for pairwise subscript testing.

Modified:
    llvm/trunk/include/llvm/Analysis/LoopDependenceAnalysis.h
    llvm/trunk/lib/Analysis/LoopDependenceAnalysis.cpp

Modified: llvm/trunk/include/llvm/Analysis/LoopDependenceAnalysis.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LoopDependenceAnalysis.h?rev=77437&r1=77436&r2=77437&view=diff

==============================================================================
--- llvm/trunk/include/llvm/Analysis/LoopDependenceAnalysis.h (original)
+++ llvm/trunk/include/llvm/Analysis/LoopDependenceAnalysis.h Wed Jul 29 00:35:53 2009
@@ -21,6 +21,7 @@
 #define LLVM_ANALYSIS_LOOP_DEPENDENCE_ANALYSIS_H
 
 #include "llvm/ADT/FoldingSet.h"
+#include "llvm/ADT/SmallVector.h"
 #include "llvm/Analysis/LoopPass.h"
 #include "llvm/Support/Allocator.h"
 #include <iosfwd>
@@ -30,6 +31,7 @@
 class AliasAnalysis;
 class AnalysisUsage;
 class ScalarEvolution;
+class SCEV;
 class Value;
 class raw_ostream;
 
@@ -43,17 +45,21 @@
   /// TODO: doc
   enum DependenceResult { Independent = 0, Dependent = 1, Unknown = 2 };
 
+  /// TODO: doc
+  struct Subscript {
+    /// TODO: Add distance, direction, breaking conditions, ...
+  };
+
   /// DependencePair - Represents a data dependence relation between to memory
   /// reference instructions.
-  ///
-  /// TODO: add subscripts vector
   struct DependencePair : public FastFoldingSetNode {
     Value *A;
     Value *B;
     DependenceResult Result;
+    SmallVector<Subscript, 4> Subscripts;
 
     DependencePair(const FoldingSetNodeID &ID, Value *a, Value *b) :
-        FastFoldingSetNode(ID), A(a), B(b), Result(Unknown) {}
+        FastFoldingSetNode(ID), A(a), B(b), Result(Unknown), Subscripts() {}
   };
 
   /// findOrInsertDependencePair - Return true if a DependencePair for the
@@ -62,7 +68,8 @@
   bool findOrInsertDependencePair(Value*, Value*, DependencePair*&);
 
   /// TODO: doc
-  DependenceResult analysePair(DependencePair *P) const;
+  DependenceResult analyseSubscript(const SCEV*, const SCEV*, Subscript*) const;
+  DependenceResult analysePair(DependencePair*) const;
 
 public:
   static char ID; // Class identification, replacement for typeinfo
@@ -88,7 +95,6 @@
   BumpPtrAllocator PairAllocator;
 }; // class LoopDependenceAnalysis
 
-
 // createLoopDependenceAnalysisPass - This creates an instance of the
 // LoopDependenceAnalysis pass.
 //

Modified: llvm/trunk/lib/Analysis/LoopDependenceAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopDependenceAnalysis.cpp?rev=77437&r1=77436&r2=77437&view=diff

==============================================================================
--- llvm/trunk/lib/Analysis/LoopDependenceAnalysis.cpp (original)
+++ llvm/trunk/lib/Analysis/LoopDependenceAnalysis.cpp Wed Jul 29 00:35:53 2009
@@ -15,6 +15,8 @@
 //
 // TODO: adapt as implementation progresses.
 //
+// TODO: document lingo (pair, subscript, index)
+//
 //===----------------------------------------------------------------------===//
 
 #define DEBUG_TYPE "lda"
@@ -24,6 +26,7 @@
 #include "llvm/Analysis/LoopPass.h"
 #include "llvm/Analysis/ScalarEvolution.h"
 #include "llvm/Instructions.h"
+#include "llvm/Operator.h"
 #include "llvm/Support/Allocator.h"
 #include "llvm/Support/Debug.h"
 #include "llvm/Support/ErrorHandling.h"
@@ -87,6 +90,10 @@
                    bObj, AA->getTypeStoreSize(bObj->getType()));
 }
 
+static inline const SCEV *GetZeroSCEV(ScalarEvolution *SE) {
+  return SE->getConstant(Type::Int32Ty, 0L);
+}
+
 //===----------------------------------------------------------------------===//
 //                             Dependence Testing
 //===----------------------------------------------------------------------===//
@@ -117,6 +124,13 @@
 }
 
 LoopDependenceAnalysis::DependenceResult
+LoopDependenceAnalysis::analyseSubscript(const SCEV *A,
+                                         const SCEV *B,
+                                         Subscript *S) const {
+  return Unknown; // TODO: Implement.
+}
+
+LoopDependenceAnalysis::DependenceResult
 LoopDependenceAnalysis::analysePair(DependencePair *P) const {
   DEBUG(errs() << "Analysing:\n" << *P->A << "\n" << *P->B << "\n");
 
@@ -145,9 +159,37 @@
     break; // The underlying objects alias, test accesses for dependence.
   }
 
-  // We failed to analyse this pair to get a more specific answer.
-  DEBUG(errs() << "---> [?] cannot analyse\n");
-  return Unknown;
+  const GEPOperator *aGEP = dyn_cast<GEPOperator>(aPtr);
+  const GEPOperator *bGEP = dyn_cast<GEPOperator>(bPtr);
+
+  if (!aGEP || !bGEP)
+    return Unknown;
+
+  // FIXME: Is filtering coupled subscripts necessary?
+
+  // Analyse indices pairwise (FIXME: use GetGEPOperands from BasicAA), adding
+  // trailing zeroes to the smaller GEP, if needed.
+  GEPOperator::const_op_iterator aIdx = aGEP->idx_begin(),
+                                 aEnd = aGEP->idx_end(),
+                                 bIdx = bGEP->idx_begin(),
+                                 bEnd = bGEP->idx_end();
+  while (aIdx != aEnd && bIdx != bEnd) {
+    const SCEV* aSCEV = (aIdx != aEnd) ? SE->getSCEV(*aIdx) : GetZeroSCEV(SE);
+    const SCEV* bSCEV = (bIdx != bEnd) ? SE->getSCEV(*bIdx) : GetZeroSCEV(SE);
+    Subscript subscript;
+    DependenceResult result = analyseSubscript(aSCEV, bSCEV, &subscript);
+    if (result != Dependent) {
+      // We either proved independence or failed to analyse this subscript.
+      // Further subscripts will not improve the situation, so abort early.
+      return result;
+    }
+    P->Subscripts.push_back(subscript);
+    if (aIdx != aEnd) ++aIdx;
+    if (bIdx != bEnd) ++bIdx;
+  }
+  // Either there were no subscripts or all subscripts were analysed to be
+  // dependent; in both cases we know the accesses are dependent.
+  return Dependent;
 }
 
 bool LoopDependenceAnalysis::depends(Value *A, Value *B) {





More information about the llvm-commits mailing list