Make SROA and PredicateSimplifier cope if TargetData is not
authorDan Gohman <gohman@apple.com>
Wed, 19 Aug 2009 18:22:18 +0000 (18:22 +0000)
committerDan Gohman <gohman@apple.com>
Wed, 19 Aug 2009 18:22:18 +0000 (18:22 +0000)
available. This is very conservative for now.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@79442 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/PredicateSimplifier.cpp
lib/Transforms/Scalar/ScalarReplAggregates.cpp

index 4bcc339464a5f6063fa1e353faeef51a0e814719..26183365a6af54acaed819098afd75f35c66a44b 100644 (file)
@@ -2284,8 +2284,6 @@ namespace {
     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
       AU.addRequiredID(BreakCriticalEdgesID);
       AU.addRequired<DominatorTree>();
-      AU.addRequired<TargetData>();
-      AU.addPreserved<TargetData>();
     }
 
   private:
@@ -2409,7 +2407,13 @@ namespace {
   bool PredicateSimplifier::runOnFunction(Function &F) {
     DominatorTree *DT = &getAnalysis<DominatorTree>();
     DTDFS = new DomTreeDFS(DT);
-    TargetData *TD = &getAnalysis<TargetData>();
+    TargetData *TD = getAnalysisIfAvailable<TargetData>();
+
+    // FIXME: PredicateSimplifier should still be able to do basic
+    // optimizations without TargetData. But for now, just exit if
+    // it's not available.
+    if (!TD) return false;
+
     Context = &F.getContext();
 
     DEBUG(errs() << "Entering Function: " << F.getName() << "\n");
index 4f99ee8e6efbf32b8a6aa19672f4e813c49b8970..378fb21a466df857602b7e08548f07c942897507 100644 (file)
@@ -68,7 +68,6 @@ namespace {
     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
       AU.addRequired<DominatorTree>();
       AU.addRequired<DominanceFrontier>();
-      AU.addRequired<TargetData>();
       AU.setPreservesCFG();
     }
 
@@ -150,9 +149,16 @@ FunctionPass *llvm::createScalarReplAggregatesPass(signed int Threshold) {
 
 
 bool SROA::runOnFunction(Function &F) {
-  TD = &getAnalysis<TargetData>();
-  
+  TD = getAnalysisIfAvailable<TargetData>();
+
   bool Changed = performPromotion(F);
+
+  // FIXME: ScalarRepl currently depends on TargetData more than it
+  // theoretically needs to. It should be refactored in order to support
+  // target-independent IR. Until this is done, just skip the actual
+  // scalar-replacement portion of this pass.
+  if (!TD) return Changed;
+
   while (1) {
     bool LocalChange = performScalarRepl(F);
     if (!LocalChange) break;   // No need to repromote if no scalarrepl